Flutter:为什么Future.then()在类变量上不起作用?

时间:2019-07-31 09:01:23

标签: android flutter dart future

代码,我告诉你的是我遇到麻烦的简化代码。

我的预期结果是[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]

2 个答案:

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