flutter - 在 Flutter 有状态小部件中使用 FutureBuilder 和 RefreshIndicator
问题描述
我有一个 Flutter 小部件,它从服务器获取数据并呈现一个列表。获取数据后,我解析数据并将其转换为应用程序中的内部对象,因此函数如下所示:
Future<List<Data>> getData(Thing thing) async {
var response = await http.get(Uri.parse(MY_URL));
// do some processing
return data;
}
之后,我定义了一个有状态的小部件,它调用这个函数并使用未来来呈现一个列表。
class DataList extends StatefulWidget {
const DataList({Key key}) : super(key: key);
@override
_DataListState createState() => _DataListState();
}
class _DataListState extends State<DataList> {
Widget createListView(BuildContext context, AsyncSnapshot snapshot) {
List<Data> values = snapshot.data;
if (values.isEmpty) {
return NoResultsWidget('No results.');
}
return ListView.builder(
itemCount: values.length,
itemBuilder: (BuildContext context, int index) {
return values[index];
},
);
}
@override
Widget build(BuildContext context) {
var data = getSomething().then((thing) => getData(thing));
return FutureBuilder(
future: data,
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return CustomErrorWidget('Error');
case ConnectionState.waiting:
return LoadingWidget();
default:
if (snapshot.hasError) {
return CustomErrorWidget('Error.');
} else {
return createListView(context, snapshot);
}
}
},
);
}
}
现在,代码以这种方式工作得很好。但是,当我尝试将我的数据移动为通过 initState 方法更新的类变量(Future<List> 类型)时,该变量永远不会更新。下面的示例代码:
class _DataListState extends State<DataList> {
Future<List<Data>> data;
....
@override
void initState() {
super.initState();
updateData();
}
void updateData() {
data = getSomething().then((thing) => getData(thing));
}
....
}
我想添加一个刷新指示器以在刷新时更新数据,为此我需要将我的数据设为类变量以在刷新时对其进行更新,但我似乎无法弄清楚如何使我的数据成为有状态小部件的状态并让它工作。任何有关 github 代码示例的帮助或指南将不胜感激。
解决方案
您需要包装data
变量的赋值,setState
以便 Flutter 知道变量已更改并重建您的小部件。
例如:
void updateData() {
setState(() {
data = getSomething().then((thing) => getData(thing));
});
}
推荐阅读
- android - 如何从领域响应中更新回收站视图项
- java - 如何测试是否在要测试的方法内创建的对象上调用了方法
- php - 解析错误:语法错误,意外的 'mailuid' (T_STRING)
- asp.net - 从网络聊天 iframe 中隐藏秘密
- spring - 在 Criteria Query Specifications 中合并不同类型的规范
- javascript - 使用 Ajax 提交时显示两个图像
- .net - GroupBy 在具有边缘 n-gram 分析器的字段上创建所有不必要的 ngram 标记作为键
- javascript - 使用 jquery 中的更改函数使用选择选项的多个动态类 id
- css - 如何在带有路由器插座的 mat-sidenav 内容中使用 p 分层菜单?
- json - 无法将 Json 绑定到对象