上一篇講到了
Flutter - BottomNavigationBar底部導航欄切換后,狀態丟失
里面提到了TabBar,這兒專門再寫一下吧,具體怎么操作,來不讓TabBar的狀態丟失。畢竟大家99%的情況都是不讓其狀態丟失,谷歌就不能默認這個選項嗎??
先看一個沒有保存狀態的例子:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final List<String> _list = ['111111', '222222', '333333']; @override Widget build(BuildContext context) { return DefaultTabController( length: _list.length, child: Scaffold( appBar: AppBar( title: Text( "TabBar Status Test", textAlign: TextAlign.center, style: TextStyle(color: Colors.white), ), centerTitle: true, bottom: TabBar( isScrollable: false, tabs: _list.map((String ss) { return Tab(text: ss); }).toList(), ), ), body: TabBarView( children: <Widget>[TextField(), TextField(), TextField()], ), ), ); } }
很簡單,一個標簽頁,每一個標簽頁下面都有一個文本框,你可以輸入文字。
但是切換標簽頁后,文字丟失。正如預期的那樣。
下面我們把TextField但是拿出來,新建一個page1.dart文件,代碼
注意紫色字體部分 AutomaticKeepAliveClientMixin
import 'package:flutter/material.dart'; class Page1 extends StatefulWidget { @override _Page1State createState() => _Page1State(); } class _Page1State extends State<Page1> with AutomaticKeepAliveClientMixin { bool get wantKeepAlive => true; @override Widget build(BuildContext context) { return Center( child: TextField(), ); } }
Page2 和 Page3 同理。
然后再main.dart中引用
import 'page1.dart'; import 'page2.dart'; import 'page3.dart';
修改
body: TabBarView( children: <Widget>[Page1(), Page2(), Page3()], ),
這樣一來,再輸入文字以后,切換標簽,狀態仍然保持!