如何更改类型的Future <dynamic>来为共享首选项键入bool

时间:2019-06-12 10:52:54

标签: flutter dart

我希望能够使用共享首选项来获取我保存的一些布尔值,因此当我第一次打开该页面时,可以使用该值来设置开关。我得到的错误是这个

“ 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,
                  ),
                )
              ],
            )
          ],
        ),
      ),
    );
  }
}

任何解释/帮助将不胜感激!谢谢!

2 个答案:

答案 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);
}