我正在从互联网上获取一些 json 数据并在无状态小部件内的列表视图构建器中显示
现在我想使用 RefreshIndicator 刷新数据。我是否需要一个有状态的小部件,或者我可以设法使用无状态的小部件来做到这一点?
我的理解:
如果我不需要刷新,我只在应用程序启动时从互联网加载数据,所以无状态小部件就足够了
如果我需要刷新,它涉及用户输入,但我不需要管理状态,我只需要重新运行构建方法(我打算通过导航到同一页面来完成,在 onRefresh 参数刷新指标)
那么我需要一个有状态的小部件吗?
我正在从互联网上获取一些 json 数据并在无状态小部件内的列表视图构建器中显示
现在我想使用 RefreshIndicator 刷新数据。我是否需要一个有状态的小部件,或者我可以设法使用无状态的小部件来做到这一点?
我的理解:
如果我不需要刷新,我只在应用程序启动时从互联网加载数据,所以无状态小部件就足够了
如果我需要刷新,它涉及用户输入,但我不需要管理状态,我只需要重新运行构建方法(我打算通过导航到同一页面来完成,在 onRefresh 参数刷新指标)
那么我需要一个有状态的小部件吗?
您必须将 StatelessWidget 更改为 StatefullWidget 并使用函数 setState (){} 来
因为您想减少StatefulWidget实例,您可以将获取数据的任务委托给父有状态小部件。您可以传递一个回调来通过StatelessWidget的构造函数执行获取数据的任务,只要我们想刷新数据就会调用该构造函数。
class _ParentWidgetState extends State<ParentWidget>{
...
Future<dynamic> _fetchData(){..}
...
Widget build(BuildContext){
return Container(
...
ChildWidget(onRefresh:_fetchData)
...
);
}
}
class ChildWidget extends StatelessWidget{
ChildWidget({Key? key,this.onRefresh}):super(key:key);
final Future<dynamic> Function() onRefresh;
...
@override
Widget build(BuildContext context){
return RefreshIndicator(
onRefresh:onRefresh,
child:..
);
...
}
}
关键是将加载数据的任务委托给父StatefulWidget的状态,以便您可以使用其他机制(如ChangeNotifier)使父小部件的状态调用 API 并在调用setState未来后以其自己的状态呈现。
如果您需要 RefreshIndicator 以再次从 Internet 获取 jsondata,您必须需要 StateFullWidget,因为您需要使用新数据重建页面。如果您不打算询问新信息,那么显示指标是没有意义的。