【问题标题】:FutureBuilder doesnt work when used with SharedPreferences与 SharedPreferences 一起使用时,FutureBuilder 不起作用
【发布时间】:2020-06-07 13:12:42
【问题描述】:

我收到了type 'Future<dynamic>' is not a subtype of type 'Future<String>'

我只是尝试将 FutureBuilder 与 SharedPreferences 结合使用,以返回我之前使用 SharedPreferences 存储的字符串。

Flutter : 'Future <dynamic>' is not a subtype of type bool

这个堆栈溢出答案与我正在做的事情完全相同,但我有一个错误?

Widget build(BuildContext context) {

    return FutureBuilder<String>(
      future: getRoleFuture(),
      builder: (context, snapshot) {
        if(snapshot.data == false) {
          return Text("No data");
        }
        else {
          return Text(snapshot.data);
        }
      }
    );
  }

getRoleFuture() async {
    var sp = await SharedPreferences.getInstance();
    return sp.getString("role");
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    原因是你在这一行中使用了 snapshot.data 作为 bool

    if(snapshot.data == false) {
          return Text("No data");
        }
    

    在哪里将 Future 返回类型设置为字符串 也许如果你这样做:

    if(snapshot.data == null || snapshot.data == '') {
          return Text("No data");
        }
        else {
          return Text(snapshot.data);
        }
    

    【讨论】:

      【解决方案2】:

      使用hasData检查快照。

      if(snapshot.hasData == false)
      

      给出返回类型。

      Future<String> getRoleFuture() async {
          var sp = await SharedPreferences.getInstance();
          return sp.getString("role");
        }
      

      【讨论】:

      • 同样的问题,没有区别
      • 这是 Future 的问题
      • 给出返回类型'Future'。
      【解决方案3】:

      在你的 FutureBuilder 未来将引用传递给你的函数:

      future: getRoleFuture,(不带括号

      所以你的代码应该是这样的:

      Widget build(BuildContext context) {
      
      return FutureBuilder<String>(
        future: getRoleFuture,
        builder: (context, snapshot) {
          if(!snapshot.hasData) {
            return Text("No data");
          }
          else {
            return Text(snapshot.data);
          }
        }
       );
      }
      
      Future<String> getRoleFuture() async {
      var sp = await SharedPreferences.getInstance();
      return sp.getString("role");
      }
      

      我们不在该代码中使用括号,因为我们不希望在遇到该代码时调用该函数。相反,我们希望将对我们函数的引用传递给未来。

      【讨论】:

        猜你喜欢
        • 2019-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 2018-11-14
        • 2016-12-03
        • 2016-10-11
        • 1970-01-01
        相关资源
        最近更新 更多