我希望能够使用共享首选项来获取我保存的一些布尔值,因此当我第一次打开该页面时,可以使用该值来设置开关。我得到的错误是这个
“ Future”类型不是“ bool”类型的子类型。
我相信我现在所获得的是Future类型。我需要对Future做些什么才能得到bool部分?
class Settings extends StatefulWidget {
createState() => SettingsState();
}
class SettingsState extends State<Settings> {
getPrefValue(String prefsKey) async {
SharedPreferences.getInstance().then((onValue) {
if(onValue.getBool(prefsKey) == null){
return true;
}
return onValue.getBool(prefsKey);
});
}
var skinOnSwitch = true;
var skinlessSwitch = true;
_saveChickenSelection() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState((){
prefs.setBool("skinlessPref", skinlessSwitch);
prefs.setBool("skinPref", skinOnSwitch);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.pink,
body: Container (
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomLeft,
end: Alignment.topRight,
stops: [0.3,0.7],
colors: [Colors.pink[300], Colors.pink[900]]
)
),
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Text("SETTINGS",
style: TextStyle(color: Colors.white,fontSize: 40)),
)
],
),
Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Text("SKINELESS BONELESS Calculation"),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Switch(
value: getPrefValue("skinlessPref"),
onChanged: (value){
setState(() {
skinlessSwitch = value;
_saveChickenSelection();
});
},
activeTrackColor: Colors.redAccent,
activeColor: Colors.lightGreenAccent,
),
)
],
),
Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Text("SKIN ON< BONE ON Calculation"),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Switch(
value: getPrefValue("skinPref"),
onChanged: (value){
setState(() {
skinOnSwitch = value;
_saveChickenSelection();
});
},
activeTrackColor: Colors.redAccent,
activeColor: Colors.lightGreenAccent,
),
)
],
)
],
),
),
);
}
}
任何解释/帮助将不胜感激!谢谢!
答案 0 :(得分:2)
我建议您将getPrefValue
函数重写为以下内容:
Future<bool> getPrefValue(String key) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getBool(key) ?? false;
}
这更清楚了发生了什么,知道空值的运算符??
已经检查了空值。
然后,您可以在小部件树上使用FutureBuilder,如其他答案所述。
答案 1 :(得分:0)
您可以使用FutureBuilder。
代替
Switch(
value: getPrefValue("skinlessPref"),
...
使用
FutureBuilder<bool>(
future: getPrefValue("skinlessPref"),
builder: (context, AsyncSnapshot<bool> snapshot) {
if (snapshot.hasData){
return Switch(
value: snapshot.data,
...
}else{
return Container();
}
}
)
您还应该将getPrefValue更改为:
Future<bool> getPrefValue(String prefsKey) async {
var prefs = await SharedPreferences.getInstance();
if (prefs.getBool(prefsKey) == null){
return true;
}
return prefs.getBool(prefsKey);
}