@@ -2219,7 +2219,7 @@ class TabPageSelectorIndicator extends StatelessWidget {
2219
2219
///
2220
2220
/// If a [TabController] is not provided, then there must be a
2221
2221
/// [DefaultTabController] ancestor.
2222
- class TabPageSelector extends StatefulWidget {
2222
+ class TabPageSelector extends StatelessWidget {
2223
2223
/// Creates a compact widget that indicates which tab has been selected.
2224
2224
const TabPageSelector ({
2225
2225
super .key,
@@ -2256,73 +2256,6 @@ class TabPageSelector extends StatefulWidget {
2256
2256
/// Defaults to [BorderStyle.solid] if value is not specified.
2257
2257
final BorderStyle ? borderStyle;
2258
2258
2259
- @override
2260
- State <TabPageSelector > createState () => _TabPageSelectorState ();
2261
- }
2262
-
2263
- class _TabPageSelectorState extends State <TabPageSelector > {
2264
- TabController ? _previousTabController;
2265
- TabController get _tabController {
2266
- final TabController ? tabController = widget.controller ?? DefaultTabController .maybeOf (context);
2267
- assert (() {
2268
- if (tabController == null ) {
2269
- throw FlutterError (
2270
- 'No TabController for $runtimeType .\n '
2271
- 'When creating a $runtimeType , you must either provide an explicit TabController '
2272
- 'using the "controller" property, or you must ensure that there is a '
2273
- 'DefaultTabController above the $runtimeType .\n '
2274
- 'In this case, there was neither an explicit controller nor a default controller.' ,
2275
- );
2276
- }
2277
- return true ;
2278
- }());
2279
- return tabController! ;
2280
- }
2281
-
2282
- CurvedAnimation ? _animation;
2283
-
2284
- @override
2285
- void initState () {
2286
- super .initState ();
2287
- _setAnimation ();
2288
- }
2289
-
2290
- @override
2291
- void didUpdateWidget (TabPageSelector oldWidget) {
2292
- super .didUpdateWidget (oldWidget);
2293
- if (_previousTabController? .animation != _tabController.animation) {
2294
- _setAnimation ();
2295
- }
2296
- if (_previousTabController != _tabController) {
2297
- _previousTabController = _tabController;
2298
- }
2299
- }
2300
-
2301
- @override
2302
- void didChangeDependencies () {
2303
- super .didChangeDependencies ();
2304
- if (_previousTabController? .animation != _tabController.animation) {
2305
- _setAnimation ();
2306
- }
2307
- if (_previousTabController != _tabController) {
2308
- _previousTabController = _tabController;
2309
- }
2310
- }
2311
-
2312
- void _setAnimation () {
2313
- _animation? .dispose ();
2314
- _animation = CurvedAnimation (
2315
- parent: _tabController.animation! ,
2316
- curve: Curves .fastOutSlowIn,
2317
- );
2318
- }
2319
-
2320
- @override
2321
- void dispose () {
2322
- _animation? .dispose ();
2323
- super .dispose ();
2324
- }
2325
-
2326
2259
Widget _buildTabIndicator (
2327
2260
int tabIndex,
2328
2261
TabController tabController,
@@ -2357,27 +2290,44 @@ class _TabPageSelectorState extends State<TabPageSelector> {
2357
2290
return TabPageSelectorIndicator (
2358
2291
backgroundColor: background,
2359
2292
borderColor: selectedColorTween.end! ,
2360
- size: widget. indicatorSize,
2361
- borderStyle: widget. borderStyle ?? BorderStyle .solid,
2293
+ size: indicatorSize,
2294
+ borderStyle: borderStyle ?? BorderStyle .solid,
2362
2295
);
2363
2296
}
2364
2297
2365
2298
@override
2366
2299
Widget build (BuildContext context) {
2367
- final Color fixColor = widget. color ?? Colors .transparent;
2368
- final Color fixSelectedColor = widget. selectedColor ?? Theme .of (context).colorScheme.secondary;
2300
+ final Color fixColor = color ?? Colors .transparent;
2301
+ final Color fixSelectedColor = selectedColor ?? Theme .of (context).colorScheme.secondary;
2369
2302
final ColorTween selectedColorTween = ColorTween (begin: fixColor, end: fixSelectedColor);
2370
2303
final ColorTween previousColorTween = ColorTween (begin: fixSelectedColor, end: fixColor);
2304
+ final TabController ? tabController = controller ?? DefaultTabController .maybeOf (context);
2371
2305
final MaterialLocalizations localizations = MaterialLocalizations .of (context);
2306
+ assert (() {
2307
+ if (tabController == null ) {
2308
+ throw FlutterError (
2309
+ 'No TabController for $runtimeType .\n '
2310
+ 'When creating a $runtimeType , you must either provide an explicit TabController '
2311
+ 'using the "controller" property, or you must ensure that there is a '
2312
+ 'DefaultTabController above the $runtimeType .\n '
2313
+ 'In this case, there was neither an explicit controller nor a default controller.' ,
2314
+ );
2315
+ }
2316
+ return true ;
2317
+ }());
2318
+ final Animation <double > animation = CurvedAnimation (
2319
+ parent: tabController! .animation! ,
2320
+ curve: Curves .fastOutSlowIn,
2321
+ );
2372
2322
return AnimatedBuilder (
2373
- animation: _animation ! ,
2323
+ animation: animation ,
2374
2324
builder: (BuildContext context, Widget ? child) {
2375
2325
return Semantics (
2376
- label: localizations.tabLabel (tabIndex: _tabController .index + 1 , tabCount: _tabController .length),
2326
+ label: localizations.tabLabel (tabIndex: tabController .index + 1 , tabCount: tabController .length),
2377
2327
child: Row (
2378
2328
mainAxisSize: MainAxisSize .min,
2379
- children: List <Widget >.generate (_tabController .length, (int tabIndex) {
2380
- return _buildTabIndicator (tabIndex, _tabController , selectedColorTween, previousColorTween);
2329
+ children: List <Widget >.generate (tabController .length, (int tabIndex) {
2330
+ return _buildTabIndicator (tabIndex, tabController , selectedColorTween, previousColorTween);
2381
2331
}).toList (),
2382
2332
),
2383
2333
);
0 commit comments