我有类似此代码的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);
}
有没有办法防止这个问题?
答案 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);
},
);