基本上,我试图制作一个应用程序,其内容将使用从网站获取信息的异步功能进行更新,但是当我尝试设置新状态时,它不会重新加载新内容。如果我调试该应用程序,它将显示当前内容是新内容,但是在“重建”整个窗口小部件之后,它不会显示新信息。
编辑:loadData()方法,基本上读取带有http包的URL,该URL包含一个JSON文件,其内容每5分钟更新一次新消息。例如,带有运动实时记分牌的.json文件的得分始终在变化,因此内容应始终随着新结果而变化。
class mainWidget extends StatefulWidget { State<StatefulWidget> createState() => new mainWidgetState(); } class mainWidgetState extends State<mainWidget> { List<Widget> _data; Timer timer; Widget build(BuildContext context) { return new ListView( children: _data); } @override void initState() { super.initState(); timer = new Timer.periodic(new Duration(seconds: 2), (Timer timer) async { String s = await loadData(); this.setState(() { _data = <Widget> [new childWidget(s)]; }); }); } } class childWidget extends StatefulWidget { childWidget(String s){ _title = s; } Widget _title; createState() => new childState(); } class childState extends State<gameCardS> { Widget _title; @override Widget build(BuildContext context) { return new GestureDetector(onTap: foo(), child: new Card(child: new Text(_title)); } initState() { super.initState(); _title = widget._title; } }
这应该可以解决您的问题。基本上,您始终希望在build方法层次结构中创建Widget 。
build
import 'dart:async'; import 'package:flutter/material.dart'; void main() => runApp(new MaterialApp(home: new Scaffold(body: new MainWidget()))); class MainWidget extends StatefulWidget { @override State createState() => new MainWidgetState(); } class MainWidgetState extends State<MainWidget> { List<ItemData> _data = new List(); Timer timer; Widget build(BuildContext context) { return new ListView(children: _data.map((item) => new ChildWidget(item)).toList()); } @override void initState() { super.initState(); timer = new Timer.periodic(new Duration(seconds: 2), (Timer timer) async { ItemData data = await loadData(); this.setState(() { _data = <ItemData>[data]; }); }); } @override void dispose() { super.dispose(); timer.cancel(); } static int testCount = 0; Future<ItemData> loadData() async { testCount++; return new ItemData("Testing #$testCount"); } } class ChildWidget extends StatefulWidget { ItemData _data; ChildWidget(ItemData data) { _data = data; } @override State<ChildWidget> createState() => new ChildState(); } class ChildState extends State<ChildWidget> { @override Widget build(BuildContext context) { return new GestureDetector(onTap: () => foo(), child: new Padding( padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), child: new Card( child: new Container( padding: const EdgeInsets.all(8.0), child: new Text(widget._data.title), ), ), ) ); } foo() { print("Card Tapped: " + widget._data.toString()); } } class ItemData { final String title; ItemData(this.title); @override String toString() { return 'ItemData{title: $title}'; } }