Flutter:为什么 Future.then() 对 class 变量不起作用?
Flutter: Why Future.then() doesn't work on class variable?
我给你看的代码是我遇到麻烦的简化代码。
我的预期结果是 [1,2,3,4,5,6],但应用显示 [1,2,3]。
我知道 "loadMoreInterger()" 应该在 "initState()" 中,但出于某种原因我必须将它放在 Widget build() {"HERE"}.
中
不知道为什么不行,以及正确结果的解决方法.....
非常感谢您的帮助:)
import 'package:flutter/material.dart';
import 'dart:async';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
// ↓↓↓↓↓↓↓↓↓↓↓WHERE I CANNOT UNDERSTAND↓↓↓↓↓↓↓↓↓↓↓
class _MyHomePageState extends State<MyHomePage> {
List<int> intList = [1,2,3];
Future<List<int>> loadMoreInteger() async {
print('Future');
return [4,5,6];
}
@override
Widget build(BuildContext context) {
loadMoreInteger().then((value) {
intList.addAll(value); // why doesn't it work?
});
print("console: $intList");
return Scaffold(
body: Center(
child: Text("display: $intList")
)
);
}
}
//Expected result: [1,2,3,4,5,6]
//Actual result: [1,2,3]
这是您的 build
方法的作用:进入方法后,它开始执行 loadMoreInteger()
future。之后,即使执行的未来是同步的,它也只会 安排通过调用 .then
产生的下一个未来的调用 。因此 build
方法继续使用旧的 intList
值执行。并且 [4,5,6]
只会在 build
完成后添加。
一般来说,您可以通过使用 await
关键字调用它来等待 future 完成。但是 build
方法被重写并且已经预定义了 return 不是未来的类型,所以你不能在 build
.
中调用 await
你能做什么:
我强烈建议从 build
方法中移动对数据的任何操作。它的目的是尽可能快地生产小部件。它可以在开发人员意想不到的某个时刻多次调用。
您可能的选择之一是将 loadMoreInteger()
移动到 initState
并在更新 intList
时调用 setState
@override
void initState() {
super.initState();
loadMoreInteger().then((value) {
setState(() {
intList.addAll(value);
});
});
}
将它放在 initState 覆盖函数中,它适用于 yu !!!!
List<int> intList = new List();
Future<List<int>> loadMoreInteger() async {
print('Future');
return [4,5,6];
}
@override
void initState() {
super.initState();
intList = [1,2,3];
loadMoreInteger().then((v){
setState(() {
intList.addAll(v) ;
});
}); }
我给你看的代码是我遇到麻烦的简化代码。
我的预期结果是 [1,2,3,4,5,6],但应用显示 [1,2,3]。
我知道 "loadMoreInterger()" 应该在 "initState()" 中,但出于某种原因我必须将它放在 Widget build() {"HERE"}.
中不知道为什么不行,以及正确结果的解决方法..... 非常感谢您的帮助:)
import 'package:flutter/material.dart';
import 'dart:async';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
// ↓↓↓↓↓↓↓↓↓↓↓WHERE I CANNOT UNDERSTAND↓↓↓↓↓↓↓↓↓↓↓
class _MyHomePageState extends State<MyHomePage> {
List<int> intList = [1,2,3];
Future<List<int>> loadMoreInteger() async {
print('Future');
return [4,5,6];
}
@override
Widget build(BuildContext context) {
loadMoreInteger().then((value) {
intList.addAll(value); // why doesn't it work?
});
print("console: $intList");
return Scaffold(
body: Center(
child: Text("display: $intList")
)
);
}
}
//Expected result: [1,2,3,4,5,6]
//Actual result: [1,2,3]
这是您的 build
方法的作用:进入方法后,它开始执行 loadMoreInteger()
future。之后,即使执行的未来是同步的,它也只会 安排通过调用 .then
产生的下一个未来的调用 。因此 build
方法继续使用旧的 intList
值执行。并且 [4,5,6]
只会在 build
完成后添加。
一般来说,您可以通过使用 await
关键字调用它来等待 future 完成。但是 build
方法被重写并且已经预定义了 return 不是未来的类型,所以你不能在 build
.
await
你能做什么:
我强烈建议从 build
方法中移动对数据的任何操作。它的目的是尽可能快地生产小部件。它可以在开发人员意想不到的某个时刻多次调用。
您可能的选择之一是将 loadMoreInteger()
移动到 initState
并在更新 intList
时调用 setState
@override
void initState() {
super.initState();
loadMoreInteger().then((value) {
setState(() {
intList.addAll(value);
});
});
}
将它放在 initState 覆盖函数中,它适用于 yu !!!!
List<int> intList = new List();
Future<List<int>> loadMoreInteger() async {
print('Future');
return [4,5,6];
}
@override
void initState() {
super.initState();
intList = [1,2,3];
loadMoreInteger().then((v){
setState(() {
intList.addAll(v) ;
});
}); }