Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 未来运行两次,因为它';在构建方法中,如何修复它?_Flutter - Fatal编程技术网

Flutter 未来运行两次,因为它';在构建方法中,如何修复它?

Flutter 未来运行两次,因为它';在构建方法中,如何修复它?,flutter,Flutter,假设我有一个生成大文件的函数 Future<File> makeBigFile() async { // lots of processing return File("generated_file.txt"); } @override Widget build(BuildContext context) { return FutureBuilder( future: makeBigFile(), builder: (BuildContext c

假设我有一个生成大文件的函数

Future<File> makeBigFile() async {
    // lots of processing
    return File("generated_file.txt");
}

@override
Widget build(BuildContext context) {
  return FutureBuilder(
    future: makeBigFile(),
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (snapshot.hasData && snapshot.data is File) {
        return Text("Success!");
      } else if (snapshot.connectionState==ConnectionState.done) {
        return Text("Error!");
      } else {
        return CircularProgressIndicator();
      }
    }
  );
}
Future makeBigFile()异步{
//大量加工
返回文件(“生成的_File.txt”);
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
future:makeBigFile(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData&&snapshot.data为文件){
返回文本(“成功!”);
}else if(snapshot.connectionState==connectionState.done){
返回文本(“错误!”);
}否则{
返回循环ProgressIndicator();
}
}
);
}
因此,无论何时构建运行,未来也会运行,这显然是不应该的。医生说

未来必须更早获得,例如在State.initState、State.didUpdateConfig或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或stateWidget.build方法调用期间创建它。如果future与FutureBuilder同时创建,则每次重建FutureBuilder的父级时,异步任务都将重新启动

据我所知(尽管阅读和重读了文档,但这并不多)
FutureBuilder
必须在
build()
中,并且它需要有
future:
可以运行多次而不会出现问题,但如果是一些不应该运行多次的长操作呢

class BigFileWidget extends StatefulWidget {
  @override
  _BigFileWidgetState createState() => _BigFileWidgetState();
}

class _BigFileWidgetState extends State<BigFileWidget> {

  Future<File> fileFuture;

  @override
  void initState() {
    fileFuture = makeBigFile();
  };

  Future<File> makeBigFile() async {
    // lots of processing
    return File("generated_file.txt");
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: fileFuture,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData && snapshot.data is File) {
            return Text("Success!");
          } else if (snapshot.connectionState==ConnectionState.done) {
            return Text("Error!");
          } else {
            return CircularProgressIndicator();
          }
        }
    );
  }
}
我应该如何更改代码,使其执行现在的操作,但不必在将来多次运行?

class BigFileWidget extensed StatefulWidget{
class BigFileWidget extends StatefulWidget {
  @override
  _BigFileWidgetState createState() => _BigFileWidgetState();
}

class _BigFileWidgetState extends State<BigFileWidget> {

  Future<File> fileFuture;

  @override
  void initState() {
    fileFuture = makeBigFile();
  };

  Future<File> makeBigFile() async {
    // lots of processing
    return File("generated_file.txt");
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: fileFuture,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasData && snapshot.data is File) {
            return Text("Success!");
          } else if (snapshot.connectionState==ConnectionState.done) {
            return Text("Error!");
          } else {
            return CircularProgressIndicator();
          }
        }
    );
  }
}
@凌驾 _BigFileWidgetState createState()=>\u BigFileWidgetState(); } 类_BigFileWidgetState扩展状态{ 未来; @凌驾 void initState(){ fileFuture=makeBigFile(); }; Future makeBigFile()异步{ //大量加工 返回文件(“生成的_File.txt”); } @凌驾 小部件构建(构建上下文){ 回归未来建设者( 未来:未来,, 生成器:(BuildContext上下文,异步快照){ if(snapshot.hasData&&snapshot.data为文件){ 返回文本(“成功!”); }else if(snapshot.connectionState==connectionState.done){ 返回文本(“错误!”); }否则{ 返回循环ProgressIndicator(); } } ); } }
文件myFile;
bool isLoading=false;
Future makeBigFile()异步{
isLoading=true;
//使用等待方法进行大量处理
myFile=File(“生成的_File.txt”);
设定状态({
isLoading=false;
});
}
@凌驾
void initState(){
makeBigFile();
};
@凌驾
小部件构建(构建上下文){
返回卸载
?循环压缩机指示器()
:Text(myFile==null?“错误”:“成功”);
}

一个简单的例子让一切变得如此清晰,直到现在我才明白文档中的意思。这适用于没有参数的函数。将来有参数的函数怎么样?