加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dart – API调用后有状态小部件上的定时问题

发布时间:2020-12-14 14:51:30 所属栏目:百科 来源:网络整理
导读:我遇到了计时问题,我从api获取数据,然后从 JSON创建一个列表.我想在结果列表视图中使用结果列表的长度作为项目计数.但是它会在itemcount上抛出null错误,然后完成处理并显示listview.我试图找到时间问题的位置以及如何处理项目和小部件,以便我可以避免错误.如
我遇到了计时问题,我从api获取数据,然后从 JSON创建一个列表.我想在结果列表视图中使用结果列表的长度作为项目计数.但是它会在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']));
    //return new Specialties.fromMap(mylist[index]);

  }


  var jsonCodec = const JsonCodec();


}

解决方法

在调用异步方法时应该使用await.您可以将initState标记为异步,它仍将覆盖.

每当你改变成员变量时,一定要调用setState().

如果在异步等待后执行此操作,请检查setState之前是否(已安装),因为该窗口小部件可能不再可见.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读