dart - 在 Flutter 中刷新小部件外部的 ListView ?

标签 dart flutter

我有一个 Flutter 应用程序,它由一个带有 slider 和标签 View 的脚手架组成。

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

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

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

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;
  }
}

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

enter image description here

最佳答案

有不同的处理方法:

  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 类必须是公共(public)的):

    // 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();
      }
      // ...
    })
    

关于dart - 在 Flutter 中刷新小部件外部的 ListView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51459387/

相关文章:

flutter - 如何在Flutter中放置这张卡片和文字?

flutter - 如何处理不同的图标大小

flutter - Flutter-如何对齐文本和图像小部件?

Flutter 事件在流中丢失

android - flutter 热重载在我的设备上不起作用

flutter - 如何在 FLUTTER 中几秒钟后重定向到 Stream Builder 中的另一个屏幕/页面?

flutter -> 找不到 com.google.gms.google-services :4. 3.15 :. 要求者:项目:

firebase - Flutter:Firebase 实时杂乱聊天

dart - 尝试在Phaser中加载.mp3文件时发生异常

flutter - 如何在Flutter中更改文本的颜色