在选项卡视图页面之间保留状态
Preserving state between tab view pages
问题
我有两个 ListViews
使用 TabController
在 TabBarView
内渲染。
我如何在每个 ListView
之间保存状态(因为缺少更好的词),以便:1.) 小部件不重建和 2.) ListView
位置被记住在选项卡之间。
相关代码
class AppState extends State<App> with SingleTickerProviderStateMixin {
TabController _tabController;
@override
void initState() {
super.initState();
_tabController = new TabController(
vsync: this,
length: _allPages.length,
);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
Widget _buildScaffold(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('headlines'),
bottom: new TabBar(
controller: _tabController,
isScrollable: true,
tabs: _allPages
.map((_Page page) => new Tab(text: page.country))
.toList()),
),
body: new TabBarView(
controller: _tabController,
children: _allPages.map((_Page page) {
return new SafeArea(
top: false,
bottom: false,
child: new Container(
key: new ObjectKey(page.country),
child: new Newsfeed(country: page.country),
),
);
}).toList()),
);
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'news app',
home: _buildScaffold(context),
);
}
}
插图 gif
长话短说,为您的 ListView 或其祖先之一使用 PageStorageKey(),在您的案例中为 Container 小部件:
child: Container(
key: PageStorageKey(page.country),
child: Newsfeed(country: page.country),
),
在此处查看详细信息:
尝试将您的子视图包含在具有偏移量的堆栈中。它帮助我保存了底部导航栏的状态。
如果您想在 TabBarView
中保持屏幕状态,您可以在您的状态 class 中使用名为 AutomaticKeepAliveClientMixin
的 mixin class。
之后你必须覆盖 wantKeepAlive
方法和 return true
.
我在这里写了一个 post:https://medium.com/@diegoveloper/flutter-persistent-tab-bars-a26220d322bc
问题
我有两个 ListViews
使用 TabController
在 TabBarView
内渲染。
我如何在每个 ListView
之间保存状态(因为缺少更好的词),以便:1.) 小部件不重建和 2.) ListView
位置被记住在选项卡之间。
相关代码
class AppState extends State<App> with SingleTickerProviderStateMixin {
TabController _tabController;
@override
void initState() {
super.initState();
_tabController = new TabController(
vsync: this,
length: _allPages.length,
);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
Widget _buildScaffold(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('headlines'),
bottom: new TabBar(
controller: _tabController,
isScrollable: true,
tabs: _allPages
.map((_Page page) => new Tab(text: page.country))
.toList()),
),
body: new TabBarView(
controller: _tabController,
children: _allPages.map((_Page page) {
return new SafeArea(
top: false,
bottom: false,
child: new Container(
key: new ObjectKey(page.country),
child: new Newsfeed(country: page.country),
),
);
}).toList()),
);
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'news app',
home: _buildScaffold(context),
);
}
}
插图 gif
长话短说,为您的 ListView 或其祖先之一使用 PageStorageKey(),在您的案例中为 Container 小部件:
child: Container(
key: PageStorageKey(page.country),
child: Newsfeed(country: page.country),
),
在此处查看详细信息:
尝试将您的子视图包含在具有偏移量的堆栈中。它帮助我保存了底部导航栏的状态。
如果您想在 TabBarView
中保持屏幕状态,您可以在您的状态 class 中使用名为 AutomaticKeepAliveClientMixin
的 mixin class。
之后你必须覆盖 wantKeepAlive
方法和 return true
.
我在这里写了一个 post:https://medium.com/@diegoveloper/flutter-persistent-tab-bars-a26220d322bc