在 flutter 构建方法中调用异步函数

Call async functions in build method flutter

我需要将文本写在“.txt”文件中,将其保存在变量中并将其提供给 Text,在 TextField 中。 这个想法是将用户输入写入一个“.txt”文件,这样他就可以在需要时在 TextField.

上阅读他所写的内容

一切正常,当我读取文件时它采用了正确的内容但是当我将它存储在一个变量中以使用它时 Text(var_name...) 我在屏幕上看到的是 "Instance of 'Future'".

我知道这个问题是由于对 async 和 future 的处理不当造成的,但我想真正理解为什么这不起作用。

这是我的代码:

Future<String> get _localPath async {
 final directory = await getApplicationDocumentsDirectory();
 return directory.path;
}

Future<File> get _localBio async {
 final path = await _localPath;
 print(path);
 return File('$path/bio.txt');
}

Future<File> _write(String text, String filename) async {
final file = await _localBio;

// Write the file.
return file.writeAsString(text);
}

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";
  }
}

Future<String>_MyRead() async {
 String read_ = await _read();
 print(read_);
 return read_;
}

请写一个完整的答案,我试了很多视频,论坛...不要只告诉我怎么做var str= _MyRead().then((value) => value); 也许这可能是答案,但请再写 2 行,因为我想了解为什么这不起作用。 我从开发官方文档中获取了代码。

您正在同步的呈现过程(stateful/stateless 小部件的构建函数)中使用异步值。您不能只将 StringFuture 放入 String 的位置。它不会工作。为什么?因为它是不同的类型,你需要特殊的方法来将变量从一种类型转换为另一种类型。

在这种情况下,您可能希望在构建过程中将此 Future 异步转换为 String。您可以为此使用 FutureBuilder

return FutureBuilder<String>(
  future: _myRead,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return Text(snapshot.data);
    } else {
      return Text('awaiting the future');
    }
  },
);

如果不将此 Future 转换为 String 进行渲染,它将只是 Instance of Future.

如果你想渲染需要时间的东西(异步),你应该使用 FutureBuilder

FutureBuilder(
 future:_myRead,
 builder: (ctx,snapshot) {
  if(snapshot.connectionState == connectionState.waiting) {
   return // your waiting Widget Ex: CircularLoadingIndicator();
} else if (snapshot.hasData) { 
  return Text(snapshot.data.toString()); // toString() is just to be safe
} else { //probably an error occured
  return Text('Something went wrong ...');
}