Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Preserving state between tab view pages

issue

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.

relevant code

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),     );   } } 

illustrating gif

https://media.giphy.com/media/2ysWhzqHVqL1xcBlBE/giphy.gif

like image 469
Colin Ricardo Avatar asked Mar 03 '18 18:03

Colin Ricardo


People also ask

How do you use TabController in flutter?

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.


1 Answers

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

like image 182
diegoveloper Avatar answered Sep 24 '22 23:09

diegoveloper