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?“错误”:“成功”);
}
一个简单的例子让一切变得如此清晰,直到现在我才明白文档中的意思。这适用于没有参数的函数。将来有参数的函数怎么样?