/
main.dart
122 lines (112 loc) · 3.12 KB
/
main.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import 'package:flutter/material.dart';
import 'package:reorderable_tabbar/reorderable_tabbar.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Reorderable TabBar',
theme: ThemeData(
useMaterial3: true,
),
home: const ReorderableTabBarPage(),
);
}
}
class ReorderableTabBarPage extends StatefulWidget {
const ReorderableTabBarPage({Key? key}) : super(key: key);
@override
State<ReorderableTabBarPage> createState() => _ReorderableTabBarPageState();
}
extension StringExt on String {
Text get text => Text(this);
Widget tab(int index) {
return Tab(
text: "Tab $this",
);
}
}
class _ReorderableTabBarPageState extends State<ReorderableTabBarPage> {
PageController pageController = PageController();
List<String> tabs = [
"1",
"2",
"3",
"4",
];
bool isScrollable = false;
bool tabSizeIsLabel = false;
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: tabs.length,
child: Scaffold(
appBar: AppBar(
elevation: 0,
title: const Text("Reorderable TabBar"),
actions: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Switch(
value: tabSizeIsLabel,
onChanged: (s) {
setState(() {
tabSizeIsLabel = s;
});
},
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Switch(
value: isScrollable,
onChanged: (s) {
setState(() {
isScrollable = s;
});
},
),
),
),
],
bottom: ReorderableTabBar(
buildDefaultDragHandles: false,
tabs: tabs.map((e) => e.tab(tabs.indexOf(e))).toList(),
indicatorSize: tabSizeIsLabel ? TabBarIndicatorSize.label : null,
isScrollable: isScrollable,
reorderingTabBackgroundColor: Colors.black45,
indicatorWeight: 5,
tabBorderRadius: const BorderRadius.vertical(
top: Radius.circular(8),
),
onReorder: (oldIndex, newIndex) async {
String temp = tabs.removeAt(oldIndex);
tabs.insert(newIndex, temp);
setState(() {});
},
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () {
tabs.add((tabs.length + 1).toString());
setState(() {});
},
),
body: TabBarView(
children: tabs.map((e) {
return Center(
child: ("$e. Page").text,
);
}).toList(),
),
),
);
}
}