Created
July 22, 2020 17:51
-
-
Save rmarau/aac83ad2d50dbb3f29f1e89c944c6c84 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
void main() { | |
runApp(MaterialApp( | |
home: MyHomePage(title: 'Dynamic Tabs'), | |
)); | |
} | |
class MyList extends StatefulWidget { | |
final key; | |
const MyList({this.key}) : super(key: key); | |
@override | |
_MyListState createState() => _MyListState(); | |
} | |
class _MyListState extends State<MyList> { | |
@override | |
Widget build(BuildContext context) { | |
return ListView.builder( | |
itemCount: 30, | |
itemBuilder: (context, index) => ListTile(title: Text( "${widget.key.toString().substring(14)}: $index" ,)) | |
); | |
} | |
} | |
class MyHomePage extends StatefulWidget { | |
MyHomePage({Key key, this.title}) : super(key: key); | |
final String title; | |
@override | |
_MyHomePageState createState() => _MyHomePageState(); | |
} | |
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin { | |
TabController _tabController; | |
final gKey_Tab0 = GlobalKey<_MyListState>(); | |
final gKey_Tab1 = GlobalKey<_MyListState>(); | |
List<Tab> _tabs = <Tab>[]; | |
_update_tabs_and_controller( newSize ){ | |
_tabs = <Tab>[ | |
if (newSize>0) Tab(key: Key("Tab0"), text: "Tab0",), | |
if (newSize>1) Tab(key: Key("Tab1"), text: "Tab1",), | |
if (newSize>2) Tab(key: Key("Tab2"), text: "Tab2",), | |
if (newSize>3) Tab(key: Key("Tab3"), text: "Tab3",), | |
].where((t)=>t!=null).toList(); | |
_tabController = TabController(vsync: this, length: _tabs.length); | |
} | |
@override | |
void initState() { | |
_tabController = TabController(vsync: this, length: 0); | |
Future.delayed(Duration(milliseconds: 500)).then((_) { | |
setState(() { | |
_update_tabs_and_controller(2); | |
}); | |
}); | |
super.initState(); | |
} | |
@override | |
void dispose() { | |
_tabController.dispose(); | |
super.dispose(); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
appBar: AppBar( | |
title: Text(widget.title), | |
), | |
body: TabBarView( | |
//physics: NeverScrollableScrollPhysics(), | |
controller: _tabController, | |
children: <Widget>[ | |
if (_tabs.any((tab)=>tab.key==Key("Tab0"))) MyList(key: gKey_Tab0), | |
if (_tabs.any((tab)=>tab.key==Key("Tab1"))) MyList(key: gKey_Tab1,), | |
if (_tabs.any((tab)=>tab.key==Key("Tab2"))) MyList(key: Key("Tab2"),), | |
if (_tabs.any((tab)=>tab.key==Key("Tab3"))) MyList(key: Key("Tab3"),), | |
].where((t)=>t!=null).toList(), | |
), | |
bottomNavigationBar: TabBar( | |
labelColor: Colors.black, | |
indicatorSize: TabBarIndicatorSize.tab, | |
tabs: _tabs, | |
controller: _tabController, | |
), | |
floatingActionButton: FloatingActionButton( | |
onPressed: (){ | |
setState(() { | |
// Switch tabs: 2->1 | |
_update_tabs_and_controller(1); | |
}); | |
}, | |
child: Icon(Icons.remove), | |
), // This trailing comma makes auto-formatting nicer for build methods. | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment