代码,我告诉你的是我遇到麻烦的简化代码。
我的预期结果是[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]
答案 0 :(得分:0)
这是您的build
方法的作用:输入该方法后,它将开始执行loadMoreInteger()
的将来。此后,即使执行的Future是同步的,也仅通过调用.then
产生的下一个Future的 schedules调用。因此,build
方法将继续使用旧的intList
值执行。并且[4,5,6]
仅在build
完成后添加。
通常,您可以通过使用await
关键字来调用它来等待将来的完成。但是build
方法已被覆盖,并且已经具有预定义的返回类型,该类型不是将来的,因此无法在await
内部调用build
。
您可以做什么:
我强烈建议您对build
方法中的数据进行任何处理。其目的是尽可能快地生成小部件。对于开发人员而言,有时可能会多次调用它。
您可能的选择之一是将loadMoreInteger()
更新到initState
并在setState
更新时调用intList
@override
void initState() {
super.initState();
loadMoreInteger().then((value) {
setState(() {
intList.addAll(value);
});
});
}
答案 1 :(得分:0)
将其放入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) ;
});
}); }