Skip to content

Instantly share code, notes, and snippets.

@rmarau
Created July 22, 2020 17:51
Show Gist options
  • Save rmarau/aac83ad2d50dbb3f29f1e89c944c6c84 to your computer and use it in GitHub Desktop.
Save rmarau/aac83ad2d50dbb3f29f1e89c944c6c84 to your computer and use it in GitHub Desktop.
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