【问题标题】:How do I change type Future<dynamic> to type bool for Shared Preferences如何将类型 Future<dynamic> 更改为共享首选项的类型 bool
【发布时间】:2019-06-12 10:52:54
【问题描述】:

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

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

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

【问题讨论】:

  • 能分享一下getInstance()方法代码吗?没有它就很难理解。
  • 您的问题不清楚。请突出您面临的问题

标签: flutter dart


【解决方案1】:

我建议您将 getPrefValue 函数重写为以下内容:

Future<bool> getPrefValue(String key) async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();  
  return prefs.getBool(key) ?? false;
}

这对正在发生的事情更加清楚,null-aware 运算符?? 已经检查了 null 值。

然后,您可以在小部件树上使用 FutureBuilder,正如其他答案所说。

【讨论】:

  • 感谢您的意见!
【解决方案2】:

您可以使用 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);
}

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2020-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2021-01-08
  • 2020-09-24
相关资源
最近更新 更多