Flutter - TabBar導航欄切換后,狀態丟失


上一篇講到了

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()],
        ),

 

這樣一來,再輸入文字以后,切換標簽,狀態仍然保持!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM