【问题标题】:Refresh a listview outside of a widget in Flutter?在 Flutter 中刷新小部件外部的列表视图?
【发布时间】:2018-12-29 18:14:42
【问题描述】:

我有一个 Flutter 应用程序,它由一个带有滑块和标签视图的脚手架组成。

tabview 包含一个 List,如下图所示。

  List<Widget> widgetList = <Widget>[
    Post(),
    Feed(),
    Location(),
    HomePage(),
    Feed(),
  ];

现在我想在移动滑块时刷新屏幕上的当前选项卡。但是,由于这些类是私有的,即_HomePageState,我不知道如何访问refreshList() 方法,如下面的sn-p 所示。

homepage.dart:

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
  var list;
  var random;

  var refreshKey = GlobalKey<RefreshIndicatorState>();

  @override
  void initState() {
    super.initState();
    random = Random();
    refreshList();
  }

  Future<Null> refreshList() async {
    refreshKey.currentState?.show(atTop: false);
    await Future.delayed(Duration(seconds: 2));

    setState(() {
      list = List.generate(random.nextInt(10), (i) => "Item $i");
    });

    return null;
  }
}

滑块不会烘焙到每个列表视图小部件中,即homepage.dart,因为滑块值适用于每个单独的选项卡。移动带有滑块的外部小部件时,如何刷新内部列表视图小部件?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    有不同的处理方法:

    1. 您可以将PageController 和页面索引传递给您的页面小部件。然后,您的页面小部件可以监听更改 (pageController.addListener(...)) 并将当前居中的页面与其页面索引进行比较。

    2. 为您要刷新的每个页面创建一个ChangeNotifier

      final postRefresh = ChangeNotifier();
      final feedRefresh = ChangeNotifier();
      ...
      
      // build method of parent:
      List<Widget> widgetList = <Widget>[
        Post(refresh: postRefresh),
        Feed(refresh: feedRefresh),
        ...
      ];
      
      // initState method of parent:
      pageController.addListener(() {
        final roundedPage = pageController.page.round();
        if(roundedPage == 0) {
          postRefresh.notifyListeners();
        }
        else if(roundedPage == 1) {
          feedRefresh.notifyListeners();
        }
        // ...
      })
      
    3. 您还可以为您的页面小部件提供一个全局键(为此,它们的 State 类必须是公共的):

      // class body of parent:
      final postPageKey = GlobalKey<PostPageState>();
      final feedPageKey = GlobalKey<FeedPageState>();
      
      // build method of parent:
      List<Widget> widgetList = <Widget>[
        Post(key: postPageKey),
        Feed(key: feedPageKey),
        ...
      ];
      
      // initState method of parent:
      pageController.addListener(() {
        final roundedPage = pageController.page.round();
        if(roundedPage == 0) {
          postPageKey.currentState?.refresh();
        }
        else if(roundedPage == 1) {
         feedPageKey.currentState?.refresh();
        }
        // ...
      })
      

    【讨论】:

      猜你喜欢
      • 2017-01-16
      • 2019-03-30
      • 2020-11-28
      • 2016-08-16
      • 2021-05-12
      • 2023-01-04
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多