我有一个Flutter应用程序,该应用程序包括一个带滑块的脚手架和一个tabview。
标签视图由一个列表组成,该列表显示在每个标签上,如下图所示。
List<Widget> widgetList = <Widget>[
Post(),
Feed(),
Location(),
HomePage(),
Feed(),
];
现在,我想在移动滑块时刷新屏幕上的当前选项卡。但是,由于这些类是私有的,即_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;
}
}
该滑块未烘焙到每个列表视图小部件中,即homepage.dart
,因为滑块值适用于每个单独的标签。当带有滑块的外部窗口小部件移动时,如何刷新内部列表视图窗口小部件?
答案 0 :(得分:3)
有不同的处理方法:
您可以将PageController
和页面索引传递到页面小部件。然后,小部件中的窗口小部件可以监听更改(pageController.addListener(...)
,并将当前居中的页面与其页面索引进行比较。
为要刷新的每个页面创建一个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();
}
// ...
})
您还可以为页面小部件提供全局密钥(为此,它们的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();
}
// ...
})