Skip to content

Commit 9cedb23

Browse files
committed
Preferences now loaded on startup
1 parent a32f5e0 commit 9cedb23

File tree

3 files changed

+153
-80
lines changed

3 files changed

+153
-80
lines changed

lib/main.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
88
import 'package:flutter/services.dart';
99
import 'package:provider/provider.dart';
1010
import 'package:provider/single_child_widget.dart';
11+
import 'package:shared_preferences/shared_preferences.dart';
1112
import 'homepage.dart';
1213
import 'editor_drawer.dart';
1314
import 'package:bitsdojo_window/bitsdojo_window.dart';
@@ -48,9 +49,15 @@ class CoreCoderAppState extends State<CoreCoderApp> {
4849
@override
4950
void initState() {
5051
super.initState();
51-
ThemeManager.currentTheme.addListener(() {
52+
_pref.then((value) {
5253
setState(() {
53-
themeName = ThemeManager.currentTheme.value;
54+
themeName = value.getString("theme") ?? themeName;
55+
ThemeManager.currentTheme = ValueNotifier(themeName);
56+
});
57+
ThemeManager.currentTheme.addListener(() {
58+
setState(() {
59+
themeName = ThemeManager.currentTheme.value;
60+
});
5461
});
5562
});
5663
if (Platform.isWindows) {
@@ -64,6 +71,8 @@ class CoreCoderAppState extends State<CoreCoderApp> {
6471
});
6572
}
6673
}
74+
static final Future<SharedPreferences> _pref =
75+
SharedPreferences.getInstance();
6776

6877
@override
6978
Widget build(BuildContext context) {

lib/plugins_browser.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ class PluginsBrowserState extends State<PluginsBrowser> {
140140
obj[key]["repo"], obj[key]["version"], obj[key]["icon"], obj[key]["desc"],
141141
obj[key]["identifier"], isInstalled
142142
));
143+
setState(() {}); // refresh
143144
}
144-
setState(() {}); // refresh
145145
}
146146
}
147147

lib/settings.dart

Lines changed: 141 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import 'package:corecoder_develop/main.dart';
22
import 'package:corecoder_develop/plugins_browser.dart';
33
import 'package:corecoder_develop/util/modules_manager.dart';
44
import 'package:corecoder_develop/util/theme_manager.dart';
5-
import 'package:flutter/cupertino.dart';
65
import 'package:flutter/material.dart';
6+
import 'package:shared_preferences/shared_preferences.dart';
77

88
import 'util/plugins_manager.dart';
99

@@ -16,60 +16,103 @@ class Settings {
1616
}
1717

1818
enum SettingsPageItemType {
19-
TypeString,
20-
TypeStringList,
21-
TypeBoolean,
22-
TypeInteger,
23-
TypeFloat
19+
typeString,
20+
typeStringList,
21+
typeBoolean,
22+
typeInteger,
23+
typeFloat
2424
}
2525

2626
class SettingsPageItem {
27-
Function(dynamic val) onSet;
27+
Function(SettingsPageItem item, dynamic val) onSet;
28+
Function(SettingsPageItem item) onInitialized;
2829
String name;
2930
String description;
3031
SettingsPageItemType type;
3132
dynamic provided; // the string list for list type
3233
dynamic defaultVal;
3334
dynamic currentVal;
3435

35-
SettingsPageItem(this.name, this.description, this.onSet, this.type,
36-
this.provided, this.defaultVal);
36+
SettingsPageItem(
37+
{required this.name,
38+
required this.description,
39+
required this.onSet,
40+
required this.onInitialized,
41+
required this.type,
42+
this.provided,
43+
this.defaultVal});
3744
}
3845

3946
class SettingsPage extends StatefulWidget {
4047
final ModulesManager modulesManager;
41-
const SettingsPage(this.modulesManager,{Key? key}) : super(key: key);
48+
49+
const SettingsPage(this.modulesManager, {Key? key}) : super(key: key);
50+
4251
@override
4352
State<StatefulWidget> createState() => SettingsPageState();
4453
}
54+
4555
class SettingsPageState extends State<SettingsPage> {
56+
static final Future<SharedPreferences> _pref =
57+
SharedPreferences.getInstance();
4658
static var routeName = "/SettingsPage";
4759
var tabs = <Widget>[
48-
const Tab(text: "General",),
60+
const Tab(
61+
text: "General",
62+
),
4963
const Tab(text: "Plugins"),
5064
const Tab(text: "About"),
5165
];
66+
5267
Widget getSettingsTabContent(BuildContext context) {
5368
return Column(
5469
children: List.generate(items.length, (index) {
70+
5571
return generateListItem(index, context);
5672
}));
5773
}
5874

5975
List<SettingsPageItem> items = [
6076
SettingsPageItem(
61-
"Theme",
62-
"The theme for entire app",
63-
(dynamic val) => {ThemeManager.setTheme(val)},
64-
SettingsPageItemType.TypeStringList,
65-
<String>["core-coder-dark", "core-coder-light"],
66-
ThemeManager.currentTheme.value)
77+
name: "Theme",
78+
description: "The theme for entire app",
79+
onSet: (SettingsPageItem item, dynamic val) async {
80+
ThemeManager.setTheme(val);
81+
82+
// Set the value to be stored
83+
(await _pref).setString("theme", val);
84+
},
85+
onInitialized: (SettingsPageItem item)async{
86+
// Get the item value from prefs
87+
var val = (await _pref).getString("theme");
88+
item.currentVal ??= val;
89+
},
90+
type: SettingsPageItemType.typeStringList,
91+
provided: <String>["core-coder-dark", "core-coder-light"],
92+
defaultVal: ThemeManager.currentTheme.value),
93+
SettingsPageItem(
94+
name: "Open last project on startup",
95+
description: "Open last project when the app started",
96+
onSet: (SettingsPageItem item, dynamic val) async {
97+
item.currentVal = val;
98+
// Set the value to be stored
99+
(await _pref).setBool("openLastProjectOnStartup", val);
100+
},
101+
onInitialized: (SettingsPageItem item)async{
102+
// Get the item value from prefs
103+
var val = (await _pref).getBool("openLastProjectOnStartup");
104+
item.currentVal ??= val;
105+
},
106+
type: SettingsPageItemType.typeBoolean,
107+
provided: <bool>[true, false],
108+
defaultVal: true)
67109
];
68110

69111
Widget generateListItem(int index, BuildContext context) {
70112
SettingsPageItem item = items[index];
113+
item.onInitialized(item);
71114
switch (item.type) {
72-
case SettingsPageItemType.TypeStringList:
115+
case SettingsPageItemType.typeStringList:
73116
var list = (item.provided as List<String>);
74117
return ListTile(
75118
title: Text(item.name),
@@ -88,7 +131,7 @@ class SettingsPageState extends State<SettingsPage> {
88131
return ListTile(
89132
title: Text(list[index]),
90133
onTap: () {
91-
item.onSet(list[index]);
134+
item.onSet(item, list[index]);
92135
item.currentVal = list[index];
93136
},
94137
);
@@ -108,17 +151,24 @@ class SettingsPageState extends State<SettingsPage> {
108151
);
109152
},
110153
);
111-
break;
112-
case SettingsPageItemType.TypeString:
113-
// TODO: Handle this case.
114-
break;
115-
case SettingsPageItemType.TypeBoolean:
154+
case SettingsPageItemType.typeString:
116155
// TODO: Handle this case.
117156
break;
118-
case SettingsPageItemType.TypeInteger:
157+
case SettingsPageItemType.typeBoolean:
158+
return CheckboxListTile(
159+
title: Text(item.name),
160+
subtitle: Text(item.description),
161+
value: item.currentVal ?? item.defaultVal,
162+
onChanged: (bool? val) {
163+
item.onSet(item, val);
164+
setState(() {
165+
item.currentVal = val;
166+
});
167+
});
168+
case SettingsPageItemType.typeInteger:
119169
// TODO: Handle this case.
120170
break;
121-
case SettingsPageItemType.TypeFloat:
171+
case SettingsPageItemType.typeFloat:
122172
// TODO: Handle this case.
123173
break;
124174
}
@@ -136,48 +186,59 @@ class SettingsPageState extends State<SettingsPage> {
136186
tabs: tabs,
137187
),
138188
),
139-
body: FutureBuilder(builder: (BuildContext context,
140-
AsyncSnapshot<String> snapshot,){
141-
return TabBarView(
142-
children: [
143-
/// General Page
144-
getSettingsTabContent(context),
145-
/// Plugins Page
146-
Column(children:[
147-
if(snapshot.hasData)
148-
Visibility(
149-
visible: snapshot.hasData,
150-
child: Text(
151-
snapshot.data!,
189+
body: FutureBuilder(
190+
builder: (
191+
BuildContext context,
192+
AsyncSnapshot<String> snapshot,
193+
) {
194+
return TabBarView(
195+
children: [
196+
/// General Page
197+
getSettingsTabContent(context),
198+
199+
/// Plugins Page
200+
Column(children: [
201+
if (snapshot.hasData)
202+
Visibility(
203+
visible: snapshot.hasData,
204+
child: Text(
205+
snapshot.data!,
206+
),
207+
),
208+
ListTile(
209+
leading: const Icon(
210+
Icons.download,
211+
size: 48,
212+
),
213+
title: const Text("Download Plugins"),
214+
subtitle: const Text("Get plugins from the internet"),
215+
onTap: () {
216+
Navigator.pushNamed(
217+
context, PluginsBrowser.routeName);
218+
},
152219
),
153-
),
154-
ListTile(
155-
leading: const Icon(Icons.download,size: 48,),
156-
title: const Text("Download Plugins"),
157-
subtitle: const Text("Get plugins from the internet"),
158-
onTap: () {
159-
Navigator.pushNamed(context, PluginsBrowser.routeName);
160-
},
161-
),
162-
ListTile(
163-
leading: const Icon(Icons.refresh,size: 48,),
164-
title: const Text("Reload Plugins"),
165-
subtitle: const Text("Reload plugins from the disk"),
166-
onTap: () {
167-
widget.modulesManager.initialize(context);
168-
setState(() {});
169-
},
170-
),
171-
const Text("Installed Plugins"),
172-
Column(children:List.generate(ModulesManager.modules.length, (index) {
173-
var mod = ModulesManager.modules[index];
174-
return ListTile(
175-
onTap: () {
176-
},
220+
ListTile(
221+
leading: const Icon(
222+
Icons.refresh,
223+
size: 48,
224+
),
225+
title: const Text("Reload Plugins"),
226+
subtitle: const Text("Reload plugins from the disk"),
227+
onTap: () {
228+
widget.modulesManager.initialize(context);
229+
setState(() {});
230+
},
231+
),
232+
const Text("Installed Plugins"),
233+
Column(
234+
children: List.generate(ModulesManager.modules.length,
235+
(index) {
236+
var mod = ModulesManager.modules[index];
237+
return ListTile(
238+
onTap: () {},
177239
leading: mod.icon,
178240
title: Text(mod.name),
179-
subtitle: Text(
180-
mod.desc + " version:" + mod.version),
241+
subtitle: Text(mod.desc + " version:" + mod.version),
181242
// trailing: PopupMenuButton<String>(
182243
// onSelected: (String result) {
183244
// switch (result) {
@@ -248,17 +309,20 @@ class SettingsPageState extends State<SettingsPage> {
248309
// ),
249310
// ],
250311
// ))
251-
);
252-
}))
253-
]),
254-
/// About page
255-
ListTile(
256-
leading: Image.asset("assets/logo.png"),
257-
title: const Text("CoreCoder Develop"),
258-
subtitle: const Text(CoreCoderApp.version),
259-
)
260-
],
261-
);
262-
},future: PluginsManager.pluginsPath,)));
312+
);
313+
}))
314+
]),
315+
316+
/// About page
317+
ListTile(
318+
leading: Image.asset("assets/logo.png"),
319+
title: const Text("CoreCoder Develop"),
320+
subtitle: const Text(CoreCoderApp.version),
321+
)
322+
],
323+
);
324+
},
325+
future: PluginsManager.pluginsPath,
326+
)));
263327
}
264328
}

0 commit comments

Comments
 (0)