簡體   English   中英

Flutter:為什么Future.then()在類變量上不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM