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之前是否(已安装),因为该窗口小部件可能不再可见. 在进行异步编程时,请考虑使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |