与SharedPreferences一起使用时,FutureBuilder不起作用

时间:2020-02-23 21:11:53

标签: flutter dart

我得到一个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");
  }

3 个答案:

答案 0 :(得分:2)

原因是您在此行中将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);
    }

答案 1 :(得分:0)

使用hasData检查快照。

if(snapshot.hasData == false)

给出返回类型。

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

答案 2 :(得分:0)

在您的FutureBuilder中,将来传递给您的函数:

未来: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");
}

我们不在该代码中使用括号,因为我们不希望在遇到该代码的地方调用该函数。相反,我们希望将来对我们的函数进行引用。