【问题标题】:setState method called after dispose()?在 dispose() 之后调用 setState 方法?
【发布时间】:2019-10-28 18:12:52
【问题描述】:

我正在尝试从服务器获取数据,然后使用列表。

我发现了一个关于堆栈溢出的相关问题,并尝试在 set state 方法之前使用 mount 属性,但这似乎不起作用。

我已尝试用最少的代码重新创建错误。

      import 'package:flutter/material.dart';
      import 'package:http/http.dart' as http;
      import 'dart:convert';

      class Test extends StatefulWidget {
        @override
        Map<String, dynamic> timelist;

        State<StatefulWidget> createState() {
          // TODO: implement createState
          return TestState();
        }
      }

      class TestState extends State<Test> {
        void initState() {
          http
              .get('https://workfeed-715b8.firebaseio.com/time.json')
              .then((http.Response response) {
            if (mounted) {
              setState(() {
                widget.timelist = json.decode(response.body);
                print(widget.timelist);
              });
            }
          });

          // TODO: implement initState

          super.initState();
        }

        @override
        Widget build(BuildContext context) {
          // TODO: implement build
          return widget.timelist != null
              ? Column(
                  children: <Widget>[
                    Expanded(
                      child: ListView.builder(
                          itemCount: widget.timelist.length,
                          itemBuilder: (BuildContext context, int index) {
                            print('Hello');
                            print(widget.timelist.length);
                          }),
                    ),
                  ],
                )
              : Text('LOADING');
        }
      }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我已经尝试过您的代码,mounted 属性工作正常。如果您有任何问题,可能是因为您尝试修改小部件中的属性。如果您有任何需要及时更改的属性,它必须在状态类中。 此外,如果您因为在未安装状态下调用 setState 而出现错误,您可以将 future 转换为 stream 并取消对 dispose 的订阅。完成下面的示例。

    class Test extends StatefulWidget {
      State<StatefulWidget> createState() {
        return TestState();
      }
    }
    
    class TestState extends State<Test> {
      String timelist;
      StreamSubscription subscription;
    
      void initState() {
        subscription = http.get('https://workfeed-715b8.firebaseio.com/time.json').asStream().listen((response) {
          setState(() {
            timelist = json.decode(response.body);
          });
        });
        super.initState();
      }
    
      @override
      void dispose() {
        subscription.cancel();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return timelist != null
            ? Column(
                children: <Widget>[
                  Expanded(
                    child: ListView.builder(
                        itemCount: timelist.length,
                        itemBuilder: (BuildContext context, int index) {
                          print('Hello');
                          print(timelist.length);
                        }),
                  ),
                ],
              )
            : Text('LOADING');
      }
    }
    

    【讨论】:

      【解决方案2】:

      当您尝试设置消失或替换小部件的状态时会发生此错误。

      您没有在代码中定义挂载变量,但您在 if 语句中使用了它。我不知道当你用另一个小部件替换小部件并且它调用 setState 时,这种情况可能会成立。这会导致该错误,因为小部件会在它消失后尝试设置它的状态。

      【讨论】:

      • 我确实理解为什么会发生错误,但在这种情况下我无法指出相同的问题。您能否指出我正在尝试设置状态的小部件,因为它已从小部件树中释放出来。
      猜你喜欢
      • 2018-08-26
      • 2021-01-01
      • 2021-12-25
      • 2020-12-05
      • 1970-01-01
      • 2021-03-12
      • 2020-12-14
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多