1

我正在从互联网上获取一些 json 数据并在无状态小部件内的列表视图构建器中显示

现在我想使用 RefreshIndicator 刷新数据。我是否需要一个有状态的小部件,或者我可以设法使用无状态的小部件来做到这一点?

我的理解

如果我不需要刷新,我只在应用程序启动时从互联网加载数据,所以无状态小部件就足够了

如果我需要刷新,它涉及用户输入,但我不需要管理状态,我只需要重新运行构建方法(我打算通过导航到同一页面来完成,在 onRefresh 参数刷新指标)

那么我需要一个有状态的小部件吗?

4

3 回答 3

1

您必须将 StatelessWidget 更改为 StatefullWidget 并使用函数 setState (){} 来

于 2020-04-16T15:41:29.597 回答
0

因为您想减少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未来后以其自己的状态呈现。

于 2022-01-13T22:10:19.137 回答
0

如果您需要 RefreshIndicator 以再次从 Internet 获取 jsondata,您必须需要 StateFullWidget,因为您需要使用新数据重建页面。如果您不打算询问新信息,那么显示指标是没有意义的。

于 2020-04-16T16:08:39.567 回答