我试图通过使用SharedPreferences来保存数据来更改主题。所以当我重新打开应用程序时,它不会重置。但问题是,当我重新打开应用程序时,它每次都会重置。
请查看我的代码,如果您已经知道的话,可能会指出问题所在,或者提供一些代码。感谢
主题:
bool? colorMode = true;
Future<bool> savebool(bool value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("colorMode", true);
return colorMode!;
}
Future<bool> loadbool() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.getBool("colorMode")!;
return colorMode!;
}
InkWell(
child: Row(mainAxisSize: MainAxisSize.min, children: const [
SizedBox(
width: 30.0,
height: 60.0,
),
Text('- Dark Mode', style: TextStyle()),
]),
onTap: () => {
themeManager.themeMode == ThemeMode.dark,
setState(
() {
themeManager.toggleTheme(colorMode!);
colorMode = colorMode;
savebool(colorMode!);
},
),
},
),
主要(部分(:
ThemeManager themeManager = ThemeManager();
@override
void initState() {
themeManager.addListener(themeListener);
super.initState();
}
@override
void dispose() {
themeManager.removeListener(themeListener);
super.dispose();
}
themeListener() {
if (mounted) {
setState(() {});
}
}
MultiProvider(
providers: [
Provider(create: (_) => User),
ChangeNotifierProvider(create: (context) => themeManager)
],
child: MaterialApp(
title: 'My app',
themeMode: themeManager.themeMode,
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
home: const LoginScreen(),
debugShowCheckedModeBanner: false,
),
);
}
}
我想你忘了在loadbool()
函数中设置colorMode
。。。
Future<bool> loadbool() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
///right here, i think it must be like this
colorMode = prefs.getBool("colorMode") ?? false;
return colorMode!;
}
您的代码不够满。我看不出您使用保存/加载功能的方式。无论如何,在您从共享偏好中获取值之前,您必须检查它是否为null。我经常在我的singleton中加载共享的偏好,比如";isLogin"firstOpenApp"令牌";。。。示例:
DataInstance().firstLogin = prefs.getBool(PreferenceConstant.PREF_KEY_FIRST_LOGIN) ?? true;