gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:46:10 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com