Flutter 在颤栗中毫不迟疑地改变主题
我正在使用提供商更改我应用程序中的主题。我的应用程序首先初始化为黑色主题Flutter 在颤栗中毫不迟疑地改变主题,flutter,flutter-provider,Flutter,Flutter Provider,我正在使用提供商更改我应用程序中的主题。我的应用程序首先初始化为黑色主题 class ThemeNotifier extends ChangeNotifier { final String key = "them"; SharedPreferences _prefs; bool _darkTheme; bool get darkTheme => _darkTheme; ThemeNotifier() { _darkTheme = true; _loa
class ThemeNotifier extends ChangeNotifier {
final String key = "them";
SharedPreferences _prefs;
bool _darkTheme;
bool get darkTheme => _darkTheme;
ThemeNotifier() {
_darkTheme = true;
_loadFromPrefs();
}
toggleTheme() {
_darkTheme = !_darkTheme;
_saveToPrefs();
notifyListeners();
}
_loadFromPrefs() async {
await _initPrefs();
_darkTheme = _prefs.getBool(key) ?? true;
notifyListeners();
}
_saveToPrefs() async {
await _initPrefs();
_prefs.setBool(key, _darkTheme);
}
_initPrefs() async {
if (_prefs == null) _prefs = await SharedPreferences.getInstance();
}
}
当我将它们更改为light时,我调用toggleTheme
方法,并将暗主题更改为false
我使用的代码如下:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider.value(
value: ThemeNotifier(),
child: Consumer<ThemeNotifier>(
builder: (context, notifire, child) {
child:
return MaterialApp(
title: "theme",
theme: notifire.darkTheme ? dark : light,
home: HomeScreen(),
);
},
),
);
}
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider.value(
值:ThemeNotifier(),
儿童:消费者(
构建者:(上下文、通知、儿童){
儿童:
返回材料PP(
标题:“主题”,
主题:notifire.darkTheme?黑暗:光明,
主页:主屏幕(),
);
},
),
);
}
}
但当我用浅色主题更改应用程序并热加载应用程序一秒钟时,我的应用程序主题变暗,然后更改为浅色模式
当我使用光模式时,我如何在没有暗模式的情况下加载应用程序?这意味着当我将它们更改为光模式时,我甚至不想在几毫秒内显示暗模式 关于
当我使用光模式时,我如何在没有暗模式的情况下加载应用程序?这意味着当我将它们更改为光模式时,我甚至不想在几毫秒内显示暗模式
当您不想在几毫秒内显示暗模式时,有两个选项:
选项1:您应该等待MaterialApp中的FutureBuilder
中的SharedReferences.getInstance()
并显示加载屏幕。加载屏幕将以浅或暗为主题,除非您独立于共享首选项中的主题对加载屏幕进行主题化
选项2:此选项对用户不太友好,因为它会在加载共享首选项之前的几毫秒内阻止任何渲染。在main.dart
中的main
功能中,可以执行以下操作:
void main() {
SharedPreferences.getInstance().then(() => runApp(MyApp()));
}
或
编辑1
关于你的评论
I/flatter(10261):在生成使用者时抛出了以下断言(脏,依赖项:I/flatter(10261):[\u DefaultInheritedProviderScope]):I/flatter(10261):失败的断言:布尔表达式不能为null
我写道我也犯了同样的错误。在我的例子中,这个错误实际上起源于我的build
方法中的某个地方,并且很难找到它。我建议使用ChangeNotifierProvider(创建:ThemeNotifier(),…
overChangeNotifierProvider.value(值:ThemeNotifier(),…
)。有关详细信息,请查看
我的直觉是,断言错误源于MaterialApp
中的行主题:notifire.darkTheme?dark:light,
,如果您更改提供程序以创建更改通知程序,而不是重用现有的通知程序,它可能会得到修复。添加--release
标志实际上只是一种解决方法nd忽略应用程序中的这种不稳定性。尝试使用此ThemeNotifier(){u loadFromPrefs();}而不是ThemeNotifier(){u darkTheme=true;_loadFromPrefs();}如果我这样做,我会得到错误i/flatter(10261):在构建消费者时抛出以下断言(脏,依赖项:i/flatter(10261):[\u DefaultInheritedProviderScope]):I/flatter(10261):断言失败:布尔表达式不能为null@FederickJonathan@sayreskabir这里也有同样的问题。你能找到解决方案吗?在发布模式下,没关系。看起来你遵循了这一点。我也这么做了,遇到了与你相同的问题。你做了哪些特别的工作来让它工作?
void main() async {
await SharedPreferences.getInstance();
runApp(MyApp());
}