我有一个 Flutter 应用程序,它由一个带有滑块和 tabview 的脚手架组成。
tabview 包含一个列表,它显示在每个选项卡上,如下图所示。
List<Widget> widgetList = <Widget>[
Post(),
Feed(),
Location(),
HomePage(),
Feed(),
];
Run Code Online (Sandbox Code Playgroud)
现在我想在移动滑块时刷新屏幕上的当前选项卡。但是,由于这些类是私有的,即_HomePageState
,我不知道如何访问该refreshList()
方法,如下面的代码片段所示。
主页.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;
}
}
Run Code Online (Sandbox Code Playgroud)
滑块不会被烘焙到每个列表视图小部件中,即homepage.dart
滑块值适用于每个单独的选项卡。当带有滑块的外部小部件移动时,如何刷新内部列表视图小部件?
有不同的方法来处理这个问题:
您可以将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();
}
// ...
})
Run Code Online (Sandbox Code Playgroud)您还可以为您的页面小部件提供一个全局键(为此,它们的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();
}
// ...
})
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
9745 次 |
最近记录: |