【问题标题】:variable not being changed out of then scope in flutter变量没有在颤动中改变超出当时的范围
【发布时间】:2020-08-07 07:47:44
【问题描述】:

我有一个未来列表和对象列表,我正在使用“.then”访问未来列表,并且在同一范围内我将对象添加到对象列表中。这是代码:

   List<Etablissement> etablist = new List<Etablissement>() ;
   //AfficherEtablissement() returns Future<dynamic>
    etabController.AfficherEtablissement().then((value) =>
    value.forEach((entry) {
      int id = entry["id"];
      Etablissement et = new Etablissement(id);
      this.etablist.add(et) ;
      print("etablist length inside the loop "+etablist.length().toString());
    })
    ) ;
      print("etablist length outside the loop "+etablist.length().toString());

循环内的 etablist 长度为 prinitng '2',因此有对象被添加到列表中,但在循环范围之外它是空的,就像没有添加任何内容一样。

【问题讨论】:

    标签: flutter dart scope


    【解决方案1】:

    then 是一个 async 调用,它不是按顺序调用的,这就是为什么第二个打印语句没有给出长度

    使用:

    @override
      void initState() {
        super.initState();
        asyncInitState(); // async is not allowed on initState() directly
      }
    
      void asyncInitState() async {
         var value = await etabController.AfficherEtablissement();
        value.forEach((entry) {
          int id = entry["id"];
          Etablissement et = new Etablissement(id);
          this.etablist.add(et) ;
          print("etablist length inside the loop "+etablist.length().toString());
        }) 
          print("etablist length outside the loop "+etablist.length().toString());
      }
    

    【讨论】:

    • 是的,列表在范围之外不是空的,但我收到此错误,因为我将异步修饰符添加到状态'Future initState() async',所以我收到此错误:'与其直接在 initState 中等待异步工作,不如调用一个单独的方法来完成这项工作而不等待它。 '
    • @silver123:修改了答案,看看。它现在应该适合你
    【解决方案2】:

    then 范围外的 print 语句在 then 块内的 print 语句之前执行。这就是前者将列表打印为空的原因。

    这是因为then 块等待Future 解析,然后才执行其中的代码。同时,它外面的打印已经执行了。

    【讨论】:

    • 所以这意味着即使在范围之外列表也不为空?
    • 是的,但过了一会儿。具体来说,在解决Future 所需的时间之后。之后,即使超出范围,列表也不会为空。因为在外面或里面,它是同一个列表。一开始它只是空的。并且未来解决后不为空。
    • 您还可以从控制台观察执行顺序。您可能已经在控制台中注意到,范围外的打印文本出现在范围内的打印文本之前。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2021-10-04
    • 2012-12-03
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多