~repos /only-bible-app

#kotlin#android#ios

git clone https://pyrossh.dev/repos/only-bible-app.git

The only bible app you will ever need. No ads. No in-app purchases. No distractions.


7326f716 pyrossh

2 years ago
improve book/chapter select
bible_app/analysis_options.yaml CHANGED
@@ -8,7 +8,8 @@
8
8
  # The following line activates a set of recommended lints for Flutter apps,
9
9
  # packages, and plugins designed to encourage good coding practices.
10
10
  include: package:flutter_lints/flutter.yaml
11
-
11
+ plugins:
12
+ - custom_lint
12
13
  linter:
13
14
  # The lint rules applied to this project can be customized in the
14
15
  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
@@ -23,7 +24,7 @@ linter:
23
24
  # producing the lint.
24
25
  rules:
25
26
  # avoid_print: false # Uncomment to disable the `avoid_print` rule
26
- # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
27
+
27
28
 
28
29
  # Additional information about this file can be found at
29
30
  # https://dart.dev/guides/language/analysis-options
bible_app/lib/components/book_selector.dart CHANGED
@@ -1,10 +1,8 @@
1
- import 'dart:async';
2
-
3
- import 'package:flutter/material.dart';
1
+ import "package:flutter/material.dart";
2
+ import "package:flutter_solidart/flutter_solidart.dart";
4
- import 'package:flutter_reactive_value/flutter_reactive_value.dart';
3
+ import "package:flutter_reactive_value/flutter_reactive_value.dart";
5
- import '../domain/book.dart';
4
+ import "../domain/book.dart";
6
- import '../domain/kannada_gen.dart';
5
+ import "../domain/kannada_gen.dart";
7
- import '../state.dart';
8
6
 
9
7
  final tabIndex = ValueNotifier(0);
10
8
  final tabBookIndex = ValueNotifier(0);
@@ -14,17 +12,20 @@ onTabBookChange(int i) {
14
12
  tabBookIndex.value = i;
15
13
  }
16
14
 
17
- onTabChapterChange(int i) {
18
- selectedVerses.value.clear();
19
- onBookChange(tabBookIndex.value);
20
- onChapterChange(i);
21
- Timer(const Duration(seconds: 1), () {
22
- tabIndex.value = 0;
23
- });
24
- }
25
-
26
15
  class BookSelector extends StatelessWidget {
27
- const BookSelector({super.key});
16
+ BookSelector({super.key});
17
+
18
+ final counter = createSignal(0);
19
+
20
+ // @override
21
+ // Widget build(BuildContext context) {
22
+ // return SignalBuilder(
23
+ // signal: counter,
24
+ // builder: (context, value, child) {
25
+ // return Text('$value');
26
+ // },
27
+ // );
28
+ // }
28
29
 
29
30
  @override
30
31
  Widget build(BuildContext context) {
@@ -32,55 +33,39 @@ class BookSelector extends StatelessWidget {
32
33
  if (tab == 1) {
33
34
  final book = kannadaBible[tabBookIndex.reactiveValue(context)];
34
35
  return Container(
35
- margin: const EdgeInsets.symmetric(vertical: 50, horizontal: 300),
36
+ margin: const EdgeInsets.symmetric(vertical: 15, horizontal: 30),
36
- padding: const EdgeInsets.all(15),
37
- color: Colors.white,
38
- child: Column(
39
- crossAxisAlignment: CrossAxisAlignment.start,
40
- children: [
41
- Container(
42
- margin: const EdgeInsets.only(bottom: 10),
43
- child: Text(book.name,
44
- style: TextStyle(
45
- fontWeight: FontWeight.w600,
46
- fontSize: 22,
47
- )),
48
- ),
49
- const Expanded(flex: 1, child: ChaptersList()),
50
- ],
51
- ));
52
- }
53
- return Container(
54
- margin: const EdgeInsets.symmetric(vertical: 50, horizontal: 300),
55
- padding: const EdgeInsets.all(15),
56
37
  color: Colors.white,
57
38
  child: Column(
58
39
  crossAxisAlignment: CrossAxisAlignment.start,
59
40
  children: [
60
41
  Container(
61
- margin: EdgeInsets.only(bottom: 10),
42
+ margin: const EdgeInsets.only(bottom: 10),
62
- child: Text("Old Testament",
43
+ child: Text(book.name, style: Theme.of(context).textTheme.headlineMedium),
63
- style: TextStyle(
64
- fontStyle: FontStyle.italic,
65
- fontWeight: FontWeight.w400,
66
- fontSize: 20,
67
- color: Colors.grey,
68
- )),
69
44
  ),
70
- Expanded(flex: 1, child: BooksList(offset: 0, books: oldTestament)),
71
- Container(
72
- margin: EdgeInsets.symmetric(vertical: 15),
45
+ const Expanded(child: ChaptersList()),
73
- child: Text("New Testament",
74
- style: TextStyle(
75
- fontStyle: FontStyle.italic,
76
- fontWeight: FontWeight.w400,
77
- fontSize: 20,
78
- color: Colors.grey,
79
- )),
80
- ),
81
- Expanded(flex: 1, child: BooksList(offset: 39, books: newTestament)),
82
46
  ],
47
+ ),
83
- ));
48
+ );
49
+ }
50
+ return Container(
51
+ margin: const EdgeInsets.symmetric(vertical: 15, horizontal: 30),
52
+ color: Colors.white,
53
+ child: Column(
54
+ crossAxisAlignment: CrossAxisAlignment.start,
55
+ children: [
56
+ Container(
57
+ margin: const EdgeInsets.only(bottom: 10),
58
+ child: Text("Old Testament", style: Theme.of(context).textTheme.headlineMedium),
59
+ ),
60
+ Expanded(child: BooksList(offset: 0, books: oldTestament)),
61
+ Container(
62
+ margin: const EdgeInsets.symmetric(vertical: 15),
63
+ child: Text("New Testament", style: Theme.of(context).textTheme.headlineMedium),
64
+ ),
65
+ Expanded(child: BooksList(offset: 39, books: newTestament)),
66
+ ],
67
+ ),
68
+ );
84
69
  }
85
70
  }
86
71
 
@@ -93,36 +78,31 @@ class BooksList extends StatelessWidget {
93
78
  @override
94
79
  Widget build(BuildContext context) {
95
80
  return GridView.extent(
96
- primary: false,
97
- padding: const EdgeInsets.all(0),
98
- crossAxisSpacing: 10.0,
81
+ crossAxisSpacing: 10.0,
99
- mainAxisSpacing: 10.0,
82
+ mainAxisSpacing: 10.0,
100
- maxCrossAxisExtent: 80.0,
83
+ maxCrossAxisExtent: 80.0,
101
- children: List.generate(books.length, (index) {
84
+ children: List.generate(books.length, (index) {
85
+ final name = books[index].replaceAll(" ", "").substring(0, 3).toUpperCase();
102
- return GestureDetector(
86
+ return GestureDetector(
103
- onTap: () {
87
+ onTap: () {
104
- onTabBookChange(offset+index);
88
+ onTabBookChange(offset + index);
105
- },
89
+ },
106
- child: Container(
90
+ child: Container(
107
- margin: const EdgeInsets.all(3),
91
+ margin: const EdgeInsets.all(3),
108
- decoration: const BoxDecoration(
92
+ decoration: const BoxDecoration(
109
- color: Colors.blueGrey,
93
+ color: Color(0xFFC8C5C5),
110
- ),
94
+ ),
111
- child: Center(
95
+ child: Center(
112
- child: Text(
96
+ child: Text(
113
- books[index]
114
- .replaceAll(" ", "")
115
- .substring(0, 3)
116
- .toUpperCase(),
97
+ name,
117
- textAlign: TextAlign.center,
98
+ textAlign: TextAlign.center,
118
- style: TextStyle(
99
+ style: Theme.of(context).textTheme.labelMedium,
119
- fontSize: 20,
120
- fontWeight: FontWeight.w500,
121
- )),
122
100
  ),
123
101
  ),
102
+ ),
124
- );
103
+ );
125
- }));
104
+ }),
105
+ );
126
106
  }
127
107
  }
128
108
 
@@ -131,35 +111,34 @@ class ChaptersList extends StatelessWidget {
131
111
 
132
112
  @override
133
113
  Widget build(BuildContext context) {
134
- final book = kannadaBible[tabBookIndex.reactiveValue(context)];
114
+ final bookIndex = tabBookIndex.reactiveValue(context);
135
-
115
+ final book = kannadaBible[bookIndex];
136
116
  return GridView.extent(
137
- primary: false,
117
+ primary: false,
138
- padding: const EdgeInsets.all(0),
118
+ padding: const EdgeInsets.all(0),
139
- crossAxisSpacing: 10.0,
119
+ crossAxisSpacing: 10.0,
140
- mainAxisSpacing: 10.0,
120
+ mainAxisSpacing: 10.0,
141
- maxCrossAxisExtent: 80.0,
121
+ maxCrossAxisExtent: 80.0,
142
- children: List.generate(book.chapters.length, (index) {
122
+ children: List.generate(book.chapters.length, (index) {
143
- return GestureDetector(
123
+ return GestureDetector(
144
- onTap: () {
124
+ onTap: () {
145
- Navigator.pop(context, index);
125
+ Navigator.of(context).pop((bookIndex, index));
146
- onTabChapterChange(index);
147
- },
126
+ },
148
- child: Container(
127
+ child: Container(
149
- margin: const EdgeInsets.all(3),
128
+ margin: const EdgeInsets.all(3),
150
- decoration: const BoxDecoration(
129
+ decoration: const BoxDecoration(
151
- color: Colors.blueGrey,
130
+ color: Color(0xFFC8C5C5),
152
- ),
131
+ ),
153
- child: Center(
132
+ child: Center(
133
+ child: Text(
154
- child: Text((index+1).toString(),
134
+ "${index + 1}",
155
- textAlign: TextAlign.center,
135
+ textAlign: TextAlign.center,
156
- style: TextStyle(
136
+ style: Theme.of(context).textTheme.labelMedium,
157
- fontSize: 20,
158
- fontWeight: FontWeight.w500,
159
- )),
160
137
  ),
161
138
  ),
139
+ ),
162
- );
140
+ );
163
- }));
141
+ }),
142
+ );
164
143
  }
165
144
  }
bible_app/lib/components/header.dart CHANGED
@@ -1,15 +1,10 @@
1
+ import "dart:math";
1
- import 'package:bible_app/components/book_selector.dart';
2
+ import "package:bible_app/components/book_selector.dart";
2
- import 'package:bible_app/state.dart';
3
+ import "package:bible_app/state.dart";
3
- import 'package:flutter/material.dart';
4
+ import "package:flutter/material.dart";
4
- import 'dart:math';
5
+ import "package:flutter/scheduler.dart";
5
-
6
- import 'package:flutter_reactive_value/flutter_reactive_value.dart';
6
+ import "package:flutter_reactive_value/flutter_reactive_value.dart";
7
-
8
- const headingStyle = TextStyle(
9
- fontSize: 20,
10
- fontWeight: FontWeight.w500,
7
+ import "../utils/dialog.dart";
11
- letterSpacing: 0.5,
12
- );
13
8
 
14
9
  class Header extends StatelessWidget {
15
10
  final String bookName;
@@ -30,16 +25,21 @@ class Header extends StatelessWidget {
30
25
  children: [
31
26
  InkWell(
32
27
  onTap: () {
33
- showDialog<void>(
34
- context: context,
35
- barrierDismissible: true,
28
+ tabBookIndex.value = 0;
29
+ showCustomDialog<(int, int)>(context, BookSelector()).then((rec) {
36
- builder: (BuildContext context) {
30
+ if (rec != null) {
37
- return const BookSelector();
31
+ selectedVerses.value.clear();
32
+ onBookChange(rec.$1);
33
+ onChapterChange(rec.$2);
34
+ SchedulerBinding.instance.addPostFrameCallback((duration) {
35
+ tabIndex.value = 0;
38
36
  });
37
+ }
38
+ });
39
39
  },
40
40
  child: Row(
41
41
  children: [
42
- Text("${bookName} ${chapter+1}", style: headingStyle),
42
+ Text("$bookName ${chapter+1}", style: Theme.of(context).textTheme.headlineLarge),
43
43
  Container(
44
44
  margin: const EdgeInsets.only(left: 3),
45
45
  child: Transform.rotate(
bible_app/lib/components/sidebar.dart CHANGED
@@ -1,10 +1,4 @@
1
- import 'package:flutter/material.dart';
1
+ import "package:flutter/material.dart";
2
-
3
- const logoStyle = TextStyle(
4
- fontSize: 38,
5
- fontWeight: FontWeight.w700,
6
- color: Color(0xFFFFB441),
7
- );
8
2
 
9
3
  class Sidebar extends StatelessWidget {
10
4
  const Sidebar({super.key});
@@ -33,15 +27,15 @@ class Sidebar extends StatelessWidget {
33
27
  height: height,
34
28
  child: Container(
35
29
  margin: const EdgeInsets.only(bottom: 50),
36
- child: const Column(
30
+ child: Column(
37
31
  mainAxisAlignment: MainAxisAlignment.center,
38
32
  crossAxisAlignment: CrossAxisAlignment.center,
39
33
  children: [
40
34
  Flexible(
41
- child: Text("KANNADA", style: logoStyle),
35
+ child: Text("KANNADA", style: Theme.of(context).textTheme.labelLarge),
42
36
  ),
43
37
  Flexible(
44
- child: Text("BIBLE", style: logoStyle),
38
+ child: Text("BIBLE", style: Theme.of(context).textTheme.labelLarge),
45
39
  ),
46
40
  ],
47
41
  ),
@@ -97,16 +91,17 @@ class Bookmark extends StatelessWidget {
97
91
  Container(
98
92
  width: 30.0,
99
93
  height: 80.0,
100
- decoration: const BoxDecoration(
94
+ decoration: BoxDecoration(
101
- color: Color(0xFFFFB341),
95
+ color: Theme.of(context).secondaryHeaderColor,
102
- borderRadius: BorderRadius.only(
96
+ borderRadius: const BorderRadius.only(
103
- topLeft: Radius.circular(4),
97
+ topLeft: Radius.circular(4),
104
- topRight: Radius.circular(4),
98
+ topRight: Radius.circular(4),
105
- )),
99
+ ),
100
+ ),
106
101
  ),
107
102
  CustomPaint(
108
103
  painter: TrianglePainter(
109
- color: Color(0xFFFFB341),
104
+ color: Theme.of(context).secondaryHeaderColor,
110
105
  ),
111
106
  ),
112
107
  ],
bible_app/lib/components/verse.dart CHANGED
@@ -1,28 +1,6 @@
1
- import 'package:flutter/material.dart';
1
+ import "package:flutter/material.dart";
2
+ import "package:flutter_reactive_value/flutter_reactive_value.dart";
2
- import '../state.dart';
3
+ import "../state.dart";
3
-
4
- const highlightColor = Color(0xAAF8D0DC);
5
-
6
- class VerseNo extends StatelessWidget {
7
- final int index;
8
-
9
- const VerseNo({super.key, required this.index});
10
-
11
- @override
12
- Widget build(BuildContext context) {
13
- return Transform.translate(
14
- offset: const Offset(0, 2),
15
- child: Text(
16
- style: const TextStyle(
17
- fontSize: 12,
18
- fontWeight: FontWeight.w800,
19
- color: Color(0xFF9A1111),
20
- ),
21
- "${index + 1}",
22
- ),
23
- );
24
- }
25
- }
26
4
 
27
5
  class Verse extends StatelessWidget {
28
6
  final int index;
@@ -32,7 +10,7 @@ class Verse extends StatelessWidget {
32
10
 
33
11
  @override
34
12
  Widget build(BuildContext context) {
35
- var selected = isVerseSelected(context, index);
13
+ var selected = selectedVerses.reactiveValue(context).contains(index);
36
14
  onTap() {
37
15
  onVerseSelected(index);
38
16
  }
@@ -42,26 +20,20 @@ class Verse extends StatelessWidget {
42
20
  onTap: onTap,
43
21
  child: Container(
44
22
  decoration: BoxDecoration(
45
- color: selected ? highlightColor : Colors.white,
23
+ color: selected ? Theme.of(context).highlightColor : Colors.white,
46
24
  ),
47
25
  child: Row(
48
26
  crossAxisAlignment: CrossAxisAlignment.start,
49
27
  children: [
50
28
  Container(
51
29
  margin: const EdgeInsets.only(right: 4),
52
- child: VerseNo(index: index),
30
+ child: Transform.translate(
31
+ offset: const Offset(0, 2),
32
+ child: Text("${index + 1}", style: Theme.of(context).textTheme.labelSmall),
33
+ ),
53
34
  ),
54
35
  Flexible(
55
- child: Text(
56
- style: const TextStyle(
57
- color: Color(0xFF010101),
58
- fontSize: 16,
59
- // fontFamily: "SanFranciscoPro",
36
+ child: Text(text, style: Theme.of(context).textTheme.bodyMedium),
60
- fontWeight: FontWeight.w500,
61
- // letterSpacing: 0.5,
62
- ),
63
- text,
64
- ),
65
37
  )
66
38
  ],
67
39
  ),
bible_app/lib/main.dart CHANGED
@@ -1,27 +1,124 @@
1
+ import "package:flutter/material.dart";
1
- import 'package:bible_app/screens/home.dart';
2
+ import "package:bible_app/screens/home.dart";
2
- import 'package:flutter/material.dart';
3
+ import "package:flutter_persistent_value_notifier/flutter_persistent_value_notifier.dart";
3
4
 
4
- final List<int> selectedVerses = [];
5
-
6
- void main() {
5
+ void main() async {
6
+ WidgetsFlutterBinding.ensureInitialized();
7
+ await initPersistentValueNotifier();
7
8
  runApp(const App());
8
9
  }
9
10
 
11
+ const lightColorScheme = ColorScheme(
12
+ brightness: Brightness.light,
13
+ primary: Color(0xFF4C2323),
14
+ onPrimary: Color(0xFF4C2323),
15
+ secondary: Colors.white,
16
+ onSecondary: Colors.white,
17
+ error: Colors.red,
18
+ onError: Colors.red,
19
+ background: Colors.white,
20
+ onBackground: Colors.white,
21
+ surface: Colors.white,
22
+ onSurface: Colors.white,
23
+ );
24
+
10
25
  class App extends StatelessWidget {
11
26
  const App({super.key});
12
27
 
13
28
  @override
14
29
  Widget build(BuildContext context) {
15
30
  return MaterialApp(
16
- title: 'Flutter Demo',
17
31
  theme: ThemeData(
32
+ brightness: Brightness.light,
33
+ primaryColor: const Color(0xFF4C2323),
34
+ secondaryHeaderColor: const Color(0xFFFFB341),
35
+ highlightColor: const Color(0xAAF8D0DC),
18
- // fontFamily: "SanFranciscoPro",
36
+ fontFamily: "SanFranciscoPro",
19
- colorScheme: ColorScheme.fromSeed(seedColor: Colors.white),
37
+ colorScheme: lightColorScheme,
38
+ textTheme: const TextTheme(
39
+ bodyMedium: TextStyle(
40
+ color: Color(0xFF010101),
41
+ fontSize: 16,
42
+ fontFamily: "SanFranciscoPro",
43
+ fontWeight: FontWeight.w400,
44
+ // letterSpacing: 0.5,
45
+ ),
46
+ headlineLarge: TextStyle(
47
+ color: Colors.black,
48
+ fontSize: 20,
49
+ fontWeight: FontWeight.w500,
20
- useMaterial3: true,
50
+ letterSpacing: 0.5,
51
+ ),
52
+ headlineMedium: TextStyle(
53
+ color: Colors.black,
54
+ fontWeight: FontWeight.w600,
55
+ fontSize: 20,
56
+ ),
57
+ labelMedium: TextStyle(
58
+ fontFamily: "SanFrancisco",
59
+ fontSize: 20,
60
+ fontWeight: FontWeight.w600,
61
+ color: Color(0xFF9A1111),
62
+ letterSpacing: 0.5,
63
+ ),
64
+ labelSmall: TextStyle(
65
+ fontFamily: "SanFrancisco",
66
+ fontSize: 12,
67
+ fontWeight: FontWeight.w800,
68
+ color: Color(0xFF9A1111),
69
+ letterSpacing: 0.5,
70
+ ),
71
+ labelLarge: TextStyle(
72
+ fontSize: 38,
73
+ fontWeight: FontWeight.w700,
74
+ color: Color(0xFFFFB341),
75
+ ),
76
+ ),
77
+ ),
78
+ darkTheme: ThemeData(
79
+ brightness: Brightness.light,
80
+ primaryColor: const Color(0xFF4C2323),
81
+ secondaryHeaderColor: const Color(0xFFFFB341),
82
+ highlightColor: const Color(0xAAF8D0DC),
83
+ fontFamily: "SanFranciscoPro",
21
84
  textTheme: const TextTheme(
22
- bodyMedium: TextStyle(color: Colors.black),
85
+ bodyMedium: TextStyle(
86
+ color: Color(0xFF010101),
87
+ fontSize: 16,
88
+ fontFamily: "SanFranciscoPro",
89
+ fontWeight: FontWeight.w400,
90
+ // letterSpacing: 0.5,
91
+ ),
92
+ headlineLarge: TextStyle(
23
- bodySmall: TextStyle(color: Colors.black),
93
+ color: Colors.black,
94
+ fontSize: 20,
95
+ fontWeight: FontWeight.w500,
96
+ letterSpacing: 0.5,
97
+ ),
98
+ headlineMedium: TextStyle(
24
- bodyLarge: TextStyle(color: Colors.black),
99
+ color: Colors.black,
100
+ fontWeight: FontWeight.w600,
101
+ fontSize: 20,
102
+ ),
103
+ labelMedium: TextStyle(
104
+ fontFamily: "SanFrancisco",
105
+ fontSize: 20,
106
+ fontWeight: FontWeight.w600,
107
+ color: Color(0xFF9A1111),
108
+ letterSpacing: 0.5,
109
+ ),
110
+ labelSmall: TextStyle(
111
+ fontFamily: "SanFrancisco",
112
+ fontSize: 12,
113
+ fontWeight: FontWeight.w800,
114
+ color: Color(0xFF9A1111),
115
+ letterSpacing: 0.5,
116
+ ),
117
+ labelLarge: TextStyle(
118
+ fontSize: 38,
119
+ fontWeight: FontWeight.w700,
120
+ color: Color(0xFFFFB341),
121
+ ),
25
122
  ),
26
123
  ),
27
124
  home: const HomeScreen(),
bible_app/lib/screens/home.dart CHANGED
@@ -1,10 +1,10 @@
1
- import 'package:bible_app/components/header.dart';
1
+ import "package:bible_app/components/header.dart";
2
- import 'package:bible_app/domain/kannada_gen.dart';
2
+ import "package:bible_app/domain/kannada_gen.dart";
3
- import 'package:flutter/material.dart';
3
+ import "package:flutter/material.dart";
4
- import 'package:flutter_reactive_value/flutter_reactive_value.dart';
4
+ import "package:flutter_reactive_value/flutter_reactive_value.dart";
5
- import '../components/sidebar.dart';
5
+ import "../components/sidebar.dart";
6
- import '../components/verse.dart';
6
+ import "../components/verse.dart";
7
- import '../state.dart';
7
+ import "../state.dart";
8
8
 
9
9
  class HomeScreen extends StatelessWidget {
10
10
  const HomeScreen({super.key});
@@ -20,27 +20,28 @@ class HomeScreen extends StatelessWidget {
20
20
  children: [
21
21
  const Sidebar(),
22
22
  Flexible(
23
- child: Column(
23
+ child: Column(
24
- children: [
24
+ children: [
25
- Header(bookName: book.name),
25
+ Header(bookName: book.name),
26
- Flexible(
26
+ Flexible(
27
- child: ListView.builder(
27
+ child: ListView.builder(
28
- padding: const EdgeInsets.symmetric(
28
+ padding: const EdgeInsets.symmetric(
29
- vertical: 20,
29
+ vertical: 20,
30
- horizontal: 40,
30
+ horizontal: 40,
31
+ ),
32
+ itemCount: items.length,
33
+ itemBuilder: (BuildContext context, int index) {
34
+ final v = items[index];
35
+ return Container(
36
+ margin: const EdgeInsets.symmetric(vertical: 6),
37
+ child: Verse(index: v.index - 1, text: v.text),
38
+ );
39
+ },
31
40
  ),
32
- itemCount: items.length,
33
- itemBuilder: (BuildContext context, int index) {
34
- final v = items[index];
35
- return Container(
36
- margin: const EdgeInsets.symmetric(vertical: 6),
37
- child: Verse(index: v.index - 1, text: v.text),
38
- );
41
+ )
39
- },
42
+ ],
40
- ),
43
+ ),
41
- )
44
+ )
42
- ],
43
- ))
44
45
  ],
45
46
  ));
46
47
  }
bible_app/lib/state.dart CHANGED
@@ -1,8 +1,15 @@
1
1
  import 'package:flutter/material.dart';
2
2
  import 'package:flutter_reactive_value/flutter_reactive_value.dart';
3
+ import "package:flutter_persistent_value_notifier/flutter_persistent_value_notifier.dart";
3
4
 
4
- final bookIndex = ValueNotifier(0);
5
+ final bookIndex = PersistentValueNotifier(
6
+ sharedPreferencesKey: "bookIndex",
7
+ initialValue: 0,
8
+ );
5
- final chapterIndex = ValueNotifier(0);
9
+ final chapterIndex = PersistentValueNotifier(
10
+ sharedPreferencesKey: "chapterIndex",
11
+ initialValue: 0,
12
+ );
6
13
  final selectedVerses = ValueNotifier([]);
7
14
 
8
15
  onBookChange(int i) {
@@ -18,9 +25,9 @@ isVerseSelected(BuildContext context, int i) {
18
25
  }
19
26
 
20
27
  onVerseSelected(int i) {
21
- if(selectedVerses.value.contains(i)) {
28
+ if (selectedVerses.value.contains(i)) {
22
- selectedVerses.value.remove(i);
29
+ selectedVerses.value = [...selectedVerses.value.where((it) => it != i)];
23
30
  } else {
24
- selectedVerses.value.add(i);
31
+ selectedVerses.value = [...selectedVerses.value, i];
25
32
  }
26
- }
33
+ }
bible_app/lib/utils/assets.dart CHANGED
@@ -1,12 +1,12 @@
1
- import 'dart:convert';
1
+ import "dart:convert";
2
- import 'dart:io';
2
+ import "dart:io";
3
- import 'package:flutter/material.dart';
3
+ import "package:flutter/material.dart";
4
- import 'package:path_provider/path_provider.dart';
4
+ import "package:path_provider/path_provider.dart";
5
5
 
6
6
  class Utils {
7
7
  static Future<String> loadAsset(BuildContext context) async {
8
8
  return await DefaultAssetBundle.of(context)
9
- .loadString('assets/kannada.csv');
9
+ .loadString("assets/kannada.csv");
10
10
  }
11
11
 
12
12
  Future<String> get _localPath async {
@@ -17,7 +17,7 @@ class Utils {
17
17
 
18
18
  Future<File> get _localFile async {
19
19
  final path = await _localPath;
20
- return File('$path/counter.txt');
20
+ return File("$path/counter.txt");
21
21
  }
22
22
 
23
23
  Future<List<String>> readCounter() async {
bible_app/lib/utils/dialog.dart ADDED
@@ -0,0 +1,135 @@
1
+ import "package:flutter/material.dart";
2
+
3
+ Future<T?> showCustomDialog<T>(BuildContext context, Widget child) {
4
+ return showGeneralDialog<T>(
5
+ context: context,
6
+ barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
7
+ barrierDismissible: true,
8
+ barrierColor: Colors.black.withOpacity(0.5),
9
+ transitionDuration: const Duration(milliseconds: 0),
10
+ transitionBuilder: (_, anim, __, child) {
11
+ return FadeTransition(
12
+ opacity: anim,
13
+ child: child,
14
+ );
15
+ },
16
+ pageBuilder: (_, __, ___) {
17
+ return Container(
18
+ // width: MediaQuery.of(context).size.width - 10,
19
+ // height: MediaQuery.of(context).size.height - 80,
20
+ color: Colors.white,
21
+ margin: const EdgeInsets.symmetric(horizontal: 250, vertical: 0),
22
+ child: child,
23
+ );
24
+ },
25
+ );
26
+ }
27
+
28
+ class DialogUtils {
29
+ static DialogUtils _instance = new DialogUtils.internal();
30
+
31
+ DialogUtils.internal();
32
+
33
+ factory DialogUtils() => _instance;
34
+
35
+ static void showCustomDialog(BuildContext context,
36
+ {required String title,
37
+ String okBtnText = "Ok",
38
+ String cancelBtnText = "Cancel",
39
+ required Function okBtnFunction}) {
40
+ showDialog(
41
+ context: context,
42
+ builder: (_) {
43
+ return AlertDialog(
44
+ title: Text(title),
45
+ // content:
46
+ actions: <Widget>[
47
+ TextButton(
48
+ child: Text(okBtnText),
49
+ onPressed: () {},
50
+ ),
51
+ TextButton(child: Text(cancelBtnText), onPressed: () => Navigator.pop(context))
52
+ ],
53
+ );
54
+ });
55
+ }
56
+ }
57
+
58
+ class PlaceholderDialog extends StatelessWidget {
59
+ const PlaceholderDialog({
60
+ this.icon,
61
+ this.title,
62
+ this.message,
63
+ this.actions = const [],
64
+ Key? key,
65
+ }) : super(key: key);
66
+
67
+ final Widget? icon;
68
+ final String? title;
69
+ final String? message;
70
+ final List<Widget> actions;
71
+
72
+ @override
73
+ Widget build(BuildContext context) {
74
+ return AlertDialog(
75
+ shape: RoundedRectangleBorder(
76
+ borderRadius: BorderRadius.circular(20.0),
77
+ ),
78
+ icon: icon,
79
+ title: title == null
80
+ ? null
81
+ : Text(
82
+ title!,
83
+ textAlign: TextAlign.center,
84
+ ),
85
+ // titleTextStyle: AppStyle.bodyBlack,
86
+ content: message == null
87
+ ? null
88
+ : Text(
89
+ message!,
90
+ textAlign: TextAlign.center,
91
+ ),
92
+ // contentTextStyle: AppStyle.textBlack,
93
+ actionsAlignment: MainAxisAlignment.center,
94
+ actionsOverflowButtonSpacing: 8.0,
95
+ actions: actions,
96
+ );
97
+ }
98
+ }
99
+
100
+
101
+ void showSlideCustomDialog(BuildContext context) {
102
+ showGeneralDialog(
103
+ context: context,
104
+ barrierLabel: "Barrier",
105
+ barrierDismissible: true,
106
+ barrierColor: Colors.black.withOpacity(0.5),
107
+ transitionDuration: Duration(milliseconds: 700),
108
+ pageBuilder: (_, __, ___) {
109
+ return Center(
110
+ child: Container(
111
+ height: 240,
112
+ child: SizedBox.expand(child: FlutterLogo()),
113
+ margin: EdgeInsets.symmetric(horizontal: 20),
114
+ decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(40)),
115
+ ),
116
+ );
117
+ },
118
+ transitionBuilder: (_, anim, __, child) {
119
+ Tween<Offset> tween;
120
+ if (anim.status == AnimationStatus.reverse) {
121
+ tween = Tween(begin: Offset(-1, 0), end: Offset.zero);
122
+ } else {
123
+ tween = Tween(begin: Offset(1, 0), end: Offset.zero);
124
+ }
125
+
126
+ return SlideTransition(
127
+ position: tween.animate(anim),
128
+ child: FadeTransition(
129
+ opacity: anim,
130
+ child: child,
131
+ ),
132
+ );
133
+ },
134
+ );
135
+ }
bible_app/lib/utils/text.dart DELETED
@@ -1,12 +0,0 @@
1
- import 'package:flutter/material.dart';
2
-
3
- class TextUtils {
4
- static error(String msg) {
5
- return Text(
6
- style: const TextStyle(
7
- color: Colors.red,
8
- ),
9
- msg,
10
- );
11
- }
12
- }
bible_app/macos/Flutter/GeneratedPluginRegistrant.swift CHANGED
@@ -6,7 +6,9 @@ import FlutterMacOS
6
6
  import Foundation
7
7
 
8
8
  import path_provider_foundation
9
+ import shared_preferences_foundation
9
10
 
10
11
  func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
11
12
  PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
13
+ SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
12
14
  }
bible_app/macos/Podfile.lock CHANGED
@@ -3,20 +3,27 @@ PODS:
3
3
  - path_provider_foundation (0.0.1):
4
4
  - Flutter
5
5
  - FlutterMacOS
6
+ - shared_preferences_foundation (0.0.1):
7
+ - Flutter
8
+ - FlutterMacOS
6
9
 
7
10
  DEPENDENCIES:
8
11
  - FlutterMacOS (from `Flutter/ephemeral`)
9
12
  - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
13
+ - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
10
14
 
11
15
  EXTERNAL SOURCES:
12
16
  FlutterMacOS:
13
17
  :path: Flutter/ephemeral
14
18
  path_provider_foundation:
15
19
  :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
20
+ shared_preferences_foundation:
21
+ :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
16
22
 
17
23
  SPEC CHECKSUMS:
18
24
  FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
19
25
  path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
26
+ shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
20
27
 
21
28
  PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
22
29
 
bible_app/pubspec.lock CHANGED
@@ -1,6 +1,38 @@
1
1
  # Generated by pub
2
2
  # See https://dart.dev/tools/pub/glossary#lockfile
3
3
  packages:
4
+ _fe_analyzer_shared:
5
+ dependency: transitive
6
+ description:
7
+ name: _fe_analyzer_shared
8
+ sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214
9
+ url: "https://pub.dev"
10
+ source: hosted
11
+ version: "58.0.0"
12
+ analyzer:
13
+ dependency: transitive
14
+ description:
15
+ name: analyzer
16
+ sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27
17
+ url: "https://pub.dev"
18
+ source: hosted
19
+ version: "5.10.0"
20
+ analyzer_plugin:
21
+ dependency: transitive
22
+ description:
23
+ name: analyzer_plugin
24
+ sha256: c1d5f167683de03d5ab6c3b53fc9aeefc5d59476e7810ba7bbddff50c6f4392d
25
+ url: "https://pub.dev"
26
+ source: hosted
27
+ version: "0.11.2"
28
+ args:
29
+ dependency: transitive
30
+ description:
31
+ name: args
32
+ sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
33
+ url: "https://pub.dev"
34
+ source: hosted
35
+ version: "2.4.2"
4
36
  async:
5
37
  dependency: transitive
6
38
  description:
@@ -25,6 +57,30 @@ packages:
25
57
  url: "https://pub.dev"
26
58
  source: hosted
27
59
  version: "1.3.0"
60
+ checked_yaml:
61
+ dependency: transitive
62
+ description:
63
+ name: checked_yaml
64
+ sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
65
+ url: "https://pub.dev"
66
+ source: hosted
67
+ version: "2.0.3"
68
+ ci:
69
+ dependency: transitive
70
+ description:
71
+ name: ci
72
+ sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13"
73
+ url: "https://pub.dev"
74
+ source: hosted
75
+ version: "0.1.0"
76
+ cli_util:
77
+ dependency: transitive
78
+ description:
79
+ name: cli_util
80
+ sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7
81
+ url: "https://pub.dev"
82
+ source: hosted
83
+ version: "0.4.0"
28
84
  clock:
29
85
  dependency: transitive
30
86
  description:
@@ -41,6 +97,22 @@ packages:
41
97
  url: "https://pub.dev"
42
98
  source: hosted
43
99
  version: "1.17.1"
100
+ convert:
101
+ dependency: transitive
102
+ description:
103
+ name: convert
104
+ sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
105
+ url: "https://pub.dev"
106
+ source: hosted
107
+ version: "3.1.1"
108
+ crypto:
109
+ dependency: transitive
110
+ description:
111
+ name: crypto
112
+ sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
113
+ url: "https://pub.dev"
114
+ source: hosted
115
+ version: "3.0.3"
44
116
  cupertino_icons:
45
117
  dependency: "direct main"
46
118
  description:
@@ -49,6 +121,38 @@ packages:
49
121
  url: "https://pub.dev"
50
122
  source: hosted
51
123
  version: "1.0.5"
124
+ custom_lint:
125
+ dependency: "direct dev"
126
+ description:
127
+ name: custom_lint
128
+ sha256: e87176016465263daf10c209df1f50a52e9e46e7612fab7462da1e6d984638f6
129
+ url: "https://pub.dev"
130
+ source: hosted
131
+ version: "0.3.4"
132
+ custom_lint_builder:
133
+ dependency: transitive
134
+ description:
135
+ name: custom_lint_builder
136
+ sha256: "6b5e20a249f2f7f15d098f802fe736b72cac14cddccdfcb46027e1b401deec9f"
137
+ url: "https://pub.dev"
138
+ source: hosted
139
+ version: "0.3.4"
140
+ custom_lint_core:
141
+ dependency: transitive
142
+ description:
143
+ name: custom_lint_core
144
+ sha256: f42f688bc26bdf4c081e011ba27a00439f17c20d9aeca4312f8022e577f8363f
145
+ url: "https://pub.dev"
146
+ source: hosted
147
+ version: "0.3.4"
148
+ dart_style:
149
+ dependency: transitive
150
+ description:
151
+ name: dart_style
152
+ sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad
153
+ url: "https://pub.dev"
154
+ source: hosted
155
+ version: "2.3.1"
52
156
  fake_async:
53
157
  dependency: transitive
54
158
  description:
@@ -65,6 +169,14 @@ packages:
65
169
  url: "https://pub.dev"
66
170
  source: hosted
67
171
  version: "2.0.2"
172
+ file:
173
+ dependency: transitive
174
+ description:
175
+ name: file
176
+ sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
177
+ url: "https://pub.dev"
178
+ source: hosted
179
+ version: "6.1.4"
68
180
  flutter:
69
181
  dependency: "direct main"
70
182
  description: flutter
@@ -78,6 +190,14 @@ packages:
78
190
  url: "https://pub.dev"
79
191
  source: hosted
80
192
  version: "2.0.2"
193
+ flutter_persistent_value_notifier:
194
+ dependency: "direct main"
195
+ description:
196
+ name: flutter_persistent_value_notifier
197
+ sha256: ed949e8081346f9bb2f709a3dd1f71bdf842e5bfed332650c046321ec935013a
198
+ url: "https://pub.dev"
199
+ source: hosted
200
+ version: "1.0.2"
81
201
  flutter_reactive_value:
82
202
  dependency: "direct main"
83
203
  description:
@@ -86,11 +206,56 @@ packages:
86
206
  url: "https://pub.dev"
87
207
  source: hosted
88
208
  version: "1.0.4"
209
+ flutter_solidart:
210
+ dependency: "direct main"
211
+ description:
212
+ name: flutter_solidart
213
+ sha256: "627b82582492c2290e8b07d2c744ea801b1d24b16b2c64170525c4b00765ba45"
214
+ url: "https://pub.dev"
215
+ source: hosted
216
+ version: "0.4.2"
217
+ flutter_staggered_grid_view:
218
+ dependency: "direct main"
219
+ description:
220
+ name: flutter_staggered_grid_view
221
+ sha256: "1312314293acceb65b92754298754801b0e1f26a1845833b740b30415bbbcf07"
222
+ url: "https://pub.dev"
223
+ source: hosted
224
+ version: "0.6.2"
89
225
  flutter_test:
90
226
  dependency: "direct dev"
91
227
  description: flutter
92
228
  source: sdk
93
229
  version: "0.0.0"
230
+ flutter_web_plugins:
231
+ dependency: transitive
232
+ description: flutter
233
+ source: sdk
234
+ version: "0.0.0"
235
+ freezed_annotation:
236
+ dependency: transitive
237
+ description:
238
+ name: freezed_annotation
239
+ sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d
240
+ url: "https://pub.dev"
241
+ source: hosted
242
+ version: "2.4.1"
243
+ glob:
244
+ dependency: transitive
245
+ description:
246
+ name: glob
247
+ sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
248
+ url: "https://pub.dev"
249
+ source: hosted
250
+ version: "2.1.2"
251
+ hotreloader:
252
+ dependency: transitive
253
+ description:
254
+ name: hotreloader
255
+ sha256: "728c0613556c1d153f7e7f4a367cffacc3f5a677d7f6497a1c2b35add4e6dacf"
256
+ url: "https://pub.dev"
257
+ source: hosted
258
+ version: "3.0.6"
94
259
  js:
95
260
  dependency: transitive
96
261
  description:
@@ -99,6 +264,14 @@ packages:
99
264
  url: "https://pub.dev"
100
265
  source: hosted
101
266
  version: "0.6.7"
267
+ json_annotation:
268
+ dependency: transitive
269
+ description:
270
+ name: json_annotation
271
+ sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
272
+ url: "https://pub.dev"
273
+ source: hosted
274
+ version: "4.8.1"
102
275
  lints:
103
276
  dependency: transitive
104
277
  description:
@@ -107,6 +280,14 @@ packages:
107
280
  url: "https://pub.dev"
108
281
  source: hosted
109
282
  version: "2.1.1"
283
+ logging:
284
+ dependency: transitive
285
+ description:
286
+ name: logging
287
+ sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
288
+ url: "https://pub.dev"
289
+ source: hosted
290
+ version: "1.2.0"
110
291
  matcher:
111
292
  dependency: transitive
112
293
  description:
@@ -131,6 +312,14 @@ packages:
131
312
  url: "https://pub.dev"
132
313
  source: hosted
133
314
  version: "1.9.1"
315
+ package_config:
316
+ dependency: transitive
317
+ description:
318
+ name: package_config
319
+ sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
320
+ url: "https://pub.dev"
321
+ source: hosted
322
+ version: "2.1.0"
134
323
  path:
135
324
  dependency: transitive
136
325
  description:
@@ -203,11 +392,107 @@ packages:
203
392
  url: "https://pub.dev"
204
393
  source: hosted
205
394
  version: "2.1.5"
395
+ pub_semver:
396
+ dependency: transitive
397
+ description:
398
+ name: pub_semver
399
+ sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
400
+ url: "https://pub.dev"
401
+ source: hosted
402
+ version: "2.1.4"
403
+ pubspec_parse:
404
+ dependency: transitive
405
+ description:
406
+ name: pubspec_parse
407
+ sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367
408
+ url: "https://pub.dev"
409
+ source: hosted
410
+ version: "1.2.3"
411
+ rxdart:
412
+ dependency: transitive
413
+ description:
414
+ name: rxdart
415
+ sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
416
+ url: "https://pub.dev"
417
+ source: hosted
418
+ version: "0.27.7"
419
+ shared_preferences:
420
+ dependency: transitive
421
+ description:
422
+ name: shared_preferences
423
+ sha256: "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1"
424
+ url: "https://pub.dev"
425
+ source: hosted
426
+ version: "2.2.0"
427
+ shared_preferences_android:
428
+ dependency: transitive
429
+ description:
430
+ name: shared_preferences_android
431
+ sha256: fe8401ec5b6dcd739a0fe9588802069e608c3fdbfd3c3c93e546cf2f90438076
432
+ url: "https://pub.dev"
433
+ source: hosted
434
+ version: "2.2.0"
435
+ shared_preferences_foundation:
436
+ dependency: transitive
437
+ description:
438
+ name: shared_preferences_foundation
439
+ sha256: f39696b83e844923b642ce9dd4bd31736c17e697f6731a5adf445b1274cf3cd4
440
+ url: "https://pub.dev"
441
+ source: hosted
442
+ version: "2.3.2"
443
+ shared_preferences_linux:
444
+ dependency: transitive
445
+ description:
446
+ name: shared_preferences_linux
447
+ sha256: "71d6806d1449b0a9d4e85e0c7a917771e672a3d5dc61149cc9fac871115018e1"
448
+ url: "https://pub.dev"
449
+ source: hosted
450
+ version: "2.3.0"
451
+ shared_preferences_platform_interface:
452
+ dependency: transitive
453
+ description:
454
+ name: shared_preferences_platform_interface
455
+ sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1"
456
+ url: "https://pub.dev"
457
+ source: hosted
458
+ version: "2.3.0"
459
+ shared_preferences_web:
460
+ dependency: transitive
461
+ description:
462
+ name: shared_preferences_web
463
+ sha256: "7347b194fb0bbeb4058e6a4e87ee70350b6b2b90f8ac5f8bd5b3a01548f6d33a"
464
+ url: "https://pub.dev"
465
+ source: hosted
466
+ version: "2.2.0"
467
+ shared_preferences_windows:
468
+ dependency: transitive
469
+ description:
470
+ name: shared_preferences_windows
471
+ sha256: f95e6a43162bce43c9c3405f3eb6f39e5b5d11f65fab19196cf8225e2777624d
472
+ url: "https://pub.dev"
473
+ source: hosted
474
+ version: "2.3.0"
206
475
  sky_engine:
207
476
  dependency: transitive
208
477
  description: flutter
209
478
  source: sdk
210
479
  version: "0.0.99"
480
+ solidart:
481
+ dependency: transitive
482
+ description:
483
+ name: solidart
484
+ sha256: "329ad04942decbc899189242e31a651c7172472f70a12325f2f81769356a6c20"
485
+ url: "https://pub.dev"
486
+ source: hosted
487
+ version: "0.3.0"
488
+ solidart_lint:
489
+ dependency: "direct dev"
490
+ description:
491
+ name: solidart_lint
492
+ sha256: "9d93a7a5f5696d18af0229d65449c609c55a040745152902fbf343c4461c111a"
493
+ url: "https://pub.dev"
494
+ source: hosted
495
+ version: "0.2.0"
211
496
  source_span:
212
497
  dependency: transitive
213
498
  description:
@@ -232,6 +517,14 @@ packages:
232
517
  url: "https://pub.dev"
233
518
  source: hosted
234
519
  version: "2.1.1"
520
+ stream_transform:
521
+ dependency: transitive
522
+ description:
523
+ name: stream_transform
524
+ sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
525
+ url: "https://pub.dev"
526
+ source: hosted
527
+ version: "2.1.0"
235
528
  string_scanner:
236
529
  dependency: transitive
237
530
  description:
@@ -256,6 +549,22 @@ packages:
256
549
  url: "https://pub.dev"
257
550
  source: hosted
258
551
  version: "0.5.1"
552
+ typed_data:
553
+ dependency: transitive
554
+ description:
555
+ name: typed_data
556
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
557
+ url: "https://pub.dev"
558
+ source: hosted
559
+ version: "1.3.2"
560
+ uuid:
561
+ dependency: transitive
562
+ description:
563
+ name: uuid
564
+ sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
565
+ url: "https://pub.dev"
566
+ source: hosted
567
+ version: "3.0.7"
259
568
  vector_math:
260
569
  dependency: transitive
261
570
  description:
@@ -264,6 +573,22 @@ packages:
264
573
  url: "https://pub.dev"
265
574
  source: hosted
266
575
  version: "2.1.4"
576
+ vm_service:
577
+ dependency: transitive
578
+ description:
579
+ name: vm_service
580
+ sha256: ada49637c27973c183dad90beb6bd781eea4c9f5f955d35da172de0af7bd3440
581
+ url: "https://pub.dev"
582
+ source: hosted
583
+ version: "11.8.0"
584
+ watcher:
585
+ dependency: transitive
586
+ description:
587
+ name: watcher
588
+ sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
589
+ url: "https://pub.dev"
590
+ source: hosted
591
+ version: "1.1.0"
267
592
  win32:
268
593
  dependency: transitive
269
594
  description:
@@ -280,6 +605,14 @@ packages:
280
605
  url: "https://pub.dev"
281
606
  source: hosted
282
607
  version: "1.0.1"
608
+ yaml:
609
+ dependency: transitive
610
+ description:
611
+ name: yaml
612
+ sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
613
+ url: "https://pub.dev"
614
+ source: hosted
615
+ version: "3.1.2"
283
616
  sdks:
284
617
  dart: ">=3.0.6 <4.0.0"
285
618
  flutter: ">=3.7.0"
bible_app/pubspec.yaml CHANGED
@@ -37,6 +37,9 @@ dependencies:
37
37
  cupertino_icons: ^1.0.2
38
38
  path_provider: ^2.0.15
39
39
  flutter_reactive_value: ^1.0.4
40
+ flutter_staggered_grid_view: 0.6.2
41
+ flutter_solidart: ^0.4.2
42
+ flutter_persistent_value_notifier: ^1.0.2
40
43
 
41
44
  dev_dependencies:
42
45
  flutter_test:
@@ -48,6 +51,8 @@ dev_dependencies:
48
51
  # package. See that file for information about deactivating specific lint
49
52
  # rules and activating additional ones.
50
53
  flutter_lints: ^2.0.0
54
+ solidart_lint: ^0.2.0
55
+ custom_lint: ^0.3.4
51
56
 
52
57
  # For information on the generic Dart part of this file, see the
53
58
  # following page: https://dart.dev/tools/pub/pubspec