I have two ListViews rendering inside of a TabBarView using a TabController.
How do I preserve state (for lack of a better word) between each ListView so that: 1.) the Widgets don't rebuild and 2.) the ListView position is remembered between tabs.
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), ); } } https://media.giphy.com/media/2ysWhzqHVqL1xcBlBE/giphy.gif
The selected tab's index can be changed with animateTo. A stateful widget that builds a TabBar or a TabBarView can create a TabController and share it directly. When the TabBar and TabBarView don't have a convenient stateful ancestor, a TabController can be shared by providing a DefaultTabController inherited widget.
In case you want to keep the state of your screen in your TabBarView, you can use the mixin class called AutomaticKeepAliveClientMixin in your State class.
After that you have to override the wantKeepAlive method and return true.
I wrote a post about that here: https://medium.com/@diegoveloper/flutter-persistent-tab-bars-a26220d322bc
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With