我需要将拨动开关的状态保存在我的应用中,并在开始时加载它。为此,我使用SharedPreferences
:
Future<bool> saveSwitchState(bool value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("switchState", value);
return prefs.setBool("switchState", value);
}
Future<bool> getSwitchState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
isSwitchedFT = prefs.getBool("switchState");
print(isSwitchedFT);
return isSwitchedFT;
}
每次更改切换值时,saveSwitchState()都会运行。
问题出在应用程序的开头。
我创建了一个布尔值:bool isSwitchedFT = false;
我初始化为false,因为null会给我错误。
我将如何设置isSwitchedFT = getSwitchState;
对于isSwitchedFT的空值,它可以编译,但是在模拟器上出现红色错误:
'package:flutter/src/material/toggleable.dart': Failed assertion: line 45 pos 15: 'tristate || value
!= null': is not true.
使用值编译时,开关可以正常工作并保存更改的值。
Switch(
value: isSwitchedFT,
onChanged: (bool value) {
setState(() {
isSwitchedFT = value;
saveSwitchState(value);
print('Saved state is $isSwitchedFT');
//switch works
});
print(isSwitchedFT);
},
activeTrackColor: Color(0xFF1D1F33),
activeColor: Colors.purple[500],
),
我想要的是用开关的最后一个值加载应用程序。 谢谢。
答案 0 :(得分:0)
检查此代码以获取示例
class _MyAppState extends State<MyApp> {
bool isSwitchedFT = false;
@override
void initState() {
// TODO: implement initState
super.initState();
getSwitchValues();
}
getSwitchValues() async {
isSwitchedFT = await getSwitchState();
setState(() {});
}
Future<bool> saveSwitchState(bool value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("switchState", value);
print('Switch Value saved $value');
return prefs.setBool("switchState", value);
}
Future<bool> getSwitchState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool isSwitchedFT = prefs.getBool("switchState");
print(isSwitchedFT);
return isSwitchedFT;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Container(
child: Center(
child: Switch(
value: isSwitchedFT,
onChanged: (bool value) {
setState(() {
isSwitchedFT = value;
saveSwitchState(value);
print('Saved state is $isSwitchedFT');
//switch works
});
print(isSwitchedFT);
},
activeTrackColor: Color(0xFF1D1F33),
activeColor: Colors.purple[500],
),
),
),
),
);
}
}
答案 1 :(得分:0)
您需要做的是加载SharedPreferences并将isSwitchedFT设置为init状态。但是因为您需要异步并等待,所以需要在单独的方法上进行操作(我也建议您仅实例化SharedPreferences一次,然后像下面所做的那样重新使用它):
SharedPreferences prefs;
@override
void initState() {
loadSharedPreferencesAndSwitchState();
super.initState();
}
void loadSharedPreferencesAndSwitchState() async {
prefs = await SharedPreferences.getInstance();
isSwitchedFT = prefs.getBool("switchState");
}
答案 2 :(得分:0)
谢谢大家。目前无法尝试。 该项目的结构由以下组成:
main.dart同时具有Stateles和Statefull小部件。 在有状态的小部件中,我将其称为switch.dart和json部分。
isSwitchedFT的初始化在主文件中进行。 看起来应该将其带到switch.dart文件中 这是完整的switch.dart文件,没有导入:
class SwitchIt extends StatefulWidget {
@override
_SwitchItState createState() => _SwitchItState();
}
class _SwitchItState extends State<SwitchIt> {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Switch(
value: isSwitchedFT,
onChanged: (bool value) {
setState(() {
isSwitchedFT = value;
saveSwitchState(value);
print('Saved state is $isSwitchedFT');
//switch works
});
print(isSwitchedFT);
},
activeTrackColor: Color(0xFF1D1F33),
activeColor: Colors.purple[500],
),
],
);
}
Future<bool> saveSwitchState(bool value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("switchState", value);
return prefs.setBool("switchState", value);
}
Future<bool> getSwitchState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
isSwitchedFT = prefs.getBool("switchState");
print(isSwitchedFT);
return isSwitchedFT;
}
也许解决方案已经发布。现在无法检查。但是这个想法是将isSwitchedFT带到switch.dart并使用initState()从shared_preferences设置其值。