如何防止数据在Widget Flutter中重新呈现

时间:2020-04-23 03:48:25

标签: flutter sharedpreferences

我有类似此代码的FutureBuilder小部件

Future getJam()async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String dataIn= prefs.getString("clock");
    return dataIn;
  }

  Widget defaultClock() {
    print(clockIn);
    return FutureBuilder(
      future: getJam(),
      builder: (context, snap) {
        if (snap.hasData ) {
              print(snap.data);
          return Text(snap.data);
        }
        else{return Text("false");}
      },
    );
  }

问题是...。数据始终先运行else{return Text("false");},然后运行

if (snap.hasData ) {
              print(snap.data);
          return Text(snap.data);
        }

有没有办法防止这个问题?

3 个答案:

答案 0 :(得分:1)

您必须检查prefs.getString(“ clock”)是否包含任何值。如果它不包含任何值,则它将返回null,因此您只会得到错误的文本。

替换代码中的以下行(注意为空)。

String dataIn = prefs.getString("clock") ?? 'default';

已更新:

我认为您想检查连接状态,如果连接状态完成,则可以检查快照是否包含数据。

如果连接状态不完整,则可以显示进度指示器。

if (snap.connectionState == ConnectionState.done) {
                  if (snap.hasData) {
                    print(snap.data);
                    return Text(snap.data);
                  } else {
                    return Text("false");
                  }
                } else {
                  return Text("Loading");
                }
              },

答案 1 :(得分:0)

不确定我是否理解正确,但是如果您想先运行代码,则更改if语句。

您的if语句检查在构建时是否已到达数据(snap.data)。这是使用Futurebuilder的正确方法。

答案 2 :(得分:0)

像这样将您的未来存储在initState或构建函数上,

Future _getJam = getJam(); // This will help prevent unnecessary re-render.

并像这样使用它,

FutureBuilder(
    future: _getJam,
    builder: (context, snap) {
        if (snap.connectionState == ConnectionState.waiting) return Text('false');
        if (snap.hasError) return Text("Something went wrong.");
        return Text(snap.data);
    },
);