如何防止数据在 Widget Flutter 中重新渲染

How to prevent data to re-rende inside Widget Flutter

我有像这样的代码的 FutureBuilder Widget

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

有没有办法避免这个问题?

您必须检查 prefs.getString("clock") 是否包含任何值。如果它不包含任何值,那么它将 return 为 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");
                }
              },

不太确定我是否理解正确,但如果您想 运行 代码(首先),请更改您的 if 语句。

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

像这样将你的未来存储在 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);
    },
);