如何防止数据在 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);
},
);
我有像这样的代码的 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);
},
);