FutureBuilder返回传递给var Flutter

时间:2020-05-30 12:11:35

标签: flutter dart

我需要将“ .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值,我不知道为什么。

1 个答案:

答案 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 ?? "")),
    );
  }
}

请注意,我尚未测试以上代码段。我只是想给出一个大概的想法。