[英]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。 之后,即使執行的Future是同步的,它也僅調度通過調用.then
產生的下一個.then
的調用。 因此, build
方法將繼續使用舊的intList
值執行。 並且[4,5,6]
僅在build
完成后才添加。
通常,您可以通過使用await
關鍵字調用它來await
將來完成。 但是build
方法已被覆蓋,並且已經具有非將來的預定義返回類型,因此您不能在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) ;
});
}); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.