我需要将“ .txt”文件中的一些数据存储到变量中。
为此,我使用了FutureBuilder
。
这个想法是使用FutureBuilder
处理读取动作(异步),并将FutureBuilder
返回给我的全局变量,该变量将在需要时进行更新。
Future<String> _read() async {
try {
final file = await _localBio;
String body = await file.readAsString();
// Read the file.
return body;
} catch (e) {
// If encountering an error, return 0.
return "Can't read";
}
}
var bio ="";
String _ReadBio(){
FutureBuilder<String>(
future: _read(),
builder: (context, snapshot){
if (snapshot.hasData) {
bio=snapshot.data.toString(); //this isn't done
return Text("");
}
else {
return Text("Error occured");
}
}
);
return "";
}
然后在TextField
中,我想显示bio
内存储的内容,该内容应该是"bio.txt"
的内容。
child: Text(
_ReadBio()== "" //always true if no error occured
? bio
: "Tell us something about you...",
),
但是显示的是第一个bio
值,我不知道为什么。
答案 0 :(得分:1)
我强烈建议您阅读有关FutureBuilder
的信息。
您遗漏了点od FutureBuilder
,因为它是要放置在小部件树中的小部件,将您所做的事情放置在返回空字符串的函数上。
相反,您可以这样做,
Future<Widget> _readAndBuildBioWidget(){
return FutureBuilder<String>(
future: _read(),
builder: (context, snapshot){
if (snapshot.hasData) {
bio=snapshot.data.toString(); //this isn't done
return Text(bio ?? "");
}
else {
return Text("Error occured");
}
}
);
return "";
}
@override
void build() {
return Scaffold(
child: _readAndBuildBioWidget(),
);
}
或者您可以执行以下操作,
class _HomeScreenState extends State<HomeScreen> {
var bio = "";
Future<String> _read() async {
try {
final file = await _localBio;
String body = await file.readAsString();
return body;
} catch (e) {
return "Can't read";
}
}
@override
void initState() {
_read().then((onValue) => bio = onValue);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: Text(bio ?? "")),
);
}
}
请注意,我尚未测试以上代码段。我只是想给出一个大概的想法。