dart - API调用后有状态小部件的 flutter 计时问题

我遇到了计时问题,我从 api 获取数据,然后从 JSON 创建一个列表。我认为使用结果列表的长度作为我的 ListView 中的项目计数。但是,它会在 itemcount 上引发 null 错误,然后完成处理并显示 ListView 。我试图找出时间问题出在哪里以及如何处理项目和小部件,以便避免错误。如果有人对我的代码存在缺陷有任何想法,我的代码如下。

class Specialty extends StatefulWidget {
  Specialty({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _SpecialtyState createState() => new _SpecialtyState();
}

class _SpecialtyState extends State<Specialty> {

  bool _dataReceived = false;
  bool _authenticated = false;
  SharedPreferences prefs;
  List mylist;


  @override
  void initState() {
    super.initState();

    _getPrefs();
    _getSpecialty();
  }


  _getPrefs() async {
    prefs = await SharedPreferences.getInstance();
    _authenticated = prefs.getBool('authenticated');
    print('AUTH2: ' + _authenticated.toString());
    print('AUTHCODE2: ' + prefs.getString('authcode'));

  }

  _getSpecialty() async {
    var _url = 'http://$baseurl:8080/support/specialty';

    var http = createHttpClient();
    var response = await http.get(_url);

    var specialties = jsonCodec.decode(response.body);

    mylist = specialties.toList();
    //_dataReceived = true;


    setState(() {
      _dataReceived = true;
    });
  }

  Future<Null> _onRefresh() {
    Completer<Null> completer = new Completer<Null>();
    Timer timer = new Timer(new Duration(seconds: 3), () {
      completer.complete();
    });
    return completer.future;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: new RefreshIndicator(
          child: new ListView.builder(
            itemBuilder: _itemBuilder,
            itemCount: mylist.length,
          ),
          onRefresh: _onRefresh,

        ));
  }

  Widget _itemBuilder(BuildContext context, int index) {
    Specialties spec = getSpec(index);
    return new SpecialtyWidget(spec: spec,);
  }

  Specialties getSpec(int index) {
    return new Specialties(
        mylist[index]['id'], mylist[index]['name'], mylist[index]['details'],
        new Photo('lib/images/' + mylist[index]['image'], mylist[index]['name'],
            mylist[index]['name']));
    //return new Specialties.fromMap(mylist[index]);

  }


  var jsonCodec = const JsonCodec();


}

最佳答案

您应该在调用 async 方法时使用 await。您可以将 initState 标记为 async,它仍然会覆盖。

确保在改变成员变量时调用 setState()

如果您在异步等待之后执行此操作,请在 setState 之前检查 if (mounted),因为小部件可能不再可见。

考虑使用 FutureBuilder在进行异步编程时,而不是 setState

https://stackoverflow.com/questions/45107702/

相关文章:

dart - 如何在 dart 中使用 request.send() 获取响应正文

android - Gradle 失败可能是因为这个 Flutter 应用程序中的 AndroidX

dart - 在小部件或状态上保留最终字段?

flutter - 使用谷歌地图的两个屏幕返回应用程序的问题

flutter - 在 Dart 中添加/减去迄今为止的月/年?

firebase - 我可以使用 StreamBuilder 在 Firestore 中收听单个文档

flutter - Cocoapods 找不到 pod Firebase 的兼容版本

dart - 如何将卡片放入 sliver 应用栏

flutter - 如何在 flutter 中修复 'net::ERR_CLEARTEXT_NOT_

flutter - Flutter 中按钮中的自定义图像