我正在制作一个我希望在开关上使用深色主题的应用程序。我已经编写了代码,并且可以正常工作,但仅适用于一页。当我返回并再次打开该页面时,它显示“错误状态错误” 。当我搜索stackoverflow时,许多建议使用共享首选项。但是我无法实现它。
CODE
class Settings extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return StreamBuilder(
stream: bloc.darkThemeEnabled,
initialData: false,
builder: (context,snapshot) => MaterialApp(
debugShowCheckedModeBanner: false ,
theme: snapshot.data?ThemeData.dark():ThemeData.light(),
home: HomePage(snapshot.data),
),
);
}
}
class HomePage extends StatelessWidget {
final bool darkThemeEnabled;
HomePage(this.darkThemeEnabled);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Settings'),
),
body: ListView(
children: <Widget>[
ListTile(
title: Text("Dark Theme",style:
TextStyle(
fontSize: 20.0
),),
trailing: Switch(
value: darkThemeEnabled,
onChanged:bloc.changeTheme,
)
)],
),
);
}
}
class Bloc{
final _themecontroller = StreamController<bool>();
get changeTheme => _themecontroller.sink.add;
get darkThemeEnabled => _themecontroller.stream;
}
final bloc = Bloc();
添加共享偏好设置:
将shared_preferences: ^0.5.4+8
添加到您的pubspec.yaml
import'package:shared_preferences / shared_preferences.dart';在您的班级
存储呼叫
final prefs = await SharedPreferences.getInstance();
prefs.setString(key, value);
阅读通话
final prefs = await SharedPreferences.getInstance();
var value = prefs.getString(key);
删除通话
final prefs = await SharedPreferences.getInstance();
prefs.remove(key);
key
是该值的键,而value
是您要存储的值在您的实例中,您可以使用key
== theme
,value
==dark
/ light
DartPad上的示例
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
ThemeMode _themeMode = ThemeMode.light;
_handleThemeModeChanged(ThemeMode mode) {
setState(() {
_themeMode = mode;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
themeMode: _themeMode,
debugShowCheckedModeBanner: false,
home: HomePage(
themeMode: _themeMode, onThemeModeChanged: _handleThemeModeChanged),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({Key key, this.themeMode, this.onThemeModeChanged})
: super(key: key);
final ThemeMode themeMode;
final ThemeModeChanged onThemeModeChanged;
onSwitch(bool value) {
final newThemeMode = value ? ThemeMode.dark : ThemeMode.light;
onThemeModeChanged(newThemeMode);
}
@override
Widget build(BuildContext context) {
final isDarkMode = themeMode == ThemeMode.dark;
return Scaffold(
appBar: AppBar(
title: Text('Settings'),
),
body: ListView(
children: <Widget>[
ListTile(
title: Text(
"Dark Theme",
style: TextStyle(fontSize: 20.0),
),
trailing: Switch(value: isDarkMode, onChanged: onSwitch))
],
),
);
}
}