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) ;
      });
    }); }