在setpose()之后调用setState方法?

时间:2019-06-14 06:24:07

标签: flutter dart

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

我发现了有关堆栈溢出的一个相关问题,并尝试在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');
        }
      }

2 个答案:

答案 0 :(得分:0)

我已经尝试过您的代码,并且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');
  }
}

答案 1 :(得分:0)

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

您尚未在代码中定义安装的变量,但已在if语句中使用了它。我不知道如何,但是当您用另一个小部件替换小部件并调用setState时,该条件可能成立。导致该错误的原因是,小部件在消失后会尝试设置其状态。