首页 > 解决方案 > FutureBuilder 返回传递给 var Flutter

问题描述

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

标签: flutterdart

解决方案


我强烈建议您阅读有关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 ?? "")),
    );
  }
}

注意上面的代码片段我没有测试过。我只是想给出一个粗略的想法。


推荐阅读