Flutter踩坑日記:Tab導航欄保持子頁面狀態

最近應邀票圈小夥伴躺坑Flutter,項目初步雛形完結。以原來的工具鏈版本爲基礎作了Flutter版本,不事後面仍是須要優化下項目接入Redux,以及擴展一些Native方法。小程序

這裏記錄一下在開發過程當中碰到的一些小問題。網絡

首先是搭建Tab的時候,切換tab子頁面,上一個頁面會被釋放,致使切換回來時會從新觸發initState等生命週期(網絡請求是放在這個裏面的)app

問了一下前同事:「須要使用 bool get wantKeepAlive => true;」,因而網上搜了一下這個玩意兒,以及其餘解決方案。ide

首先說說使用wantKeepAlive的方案:這是Flutter官方提供並推薦的,源自於AutomaticKeepAliveClientMixin用於自定義保存狀態。函數

先看看實現Tab的代碼(有幾種實現Tab的方式,後續博客更新):工具

class _TabPageState extends State<TabPage> with SingleTickerProviderStateMixin {
  //屬性
  int _tabindex;
  PageController _pageController;

  @override
  void initState() {
    print("tabController");
    super.initState();
    _pageController = new PageController();
    _tabindex = 0;
  }

  //當整個頁面dispose時,記得把控制器也dispose掉,釋放內存
  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    print("tabIndex $_tabindex");
    return Scaffold(
      body: new PageView(
        children: [new ListPage(), new AppletPage()],
        controller: _pageController,
        physics: new NeverScrollableScrollPhysics(),
        onPageChanged: onPageChanged,
      ),
      bottomNavigationBar: new BottomNavigationBar(
        onTap: navigationTapped,
        currentIndex: _tabindex,
        items: <BottomNavigationBarItem>[
          new BottomNavigationBarItem(
              icon: new Icon(Icons.brightness_5), title: new Text("工具鏈")),
          new BottomNavigationBarItem(
              icon: new Icon(Icons.map), title: new Text("小程序"))
        ],
      ),
    );
  }

  void navigationTapped(int page) {
    //Animating Page
    _pageController.jumpToPage(page);
  }

  void onPageChanged(int page) {
    setState(() {
      this._tabindex = page;
    });
  }
}

根據官網的要求:優化

  1. PageView的children須要繼承自 StatefulWidget
  2. PageView的children的State須要繼承自 AutomaticKeepAliveClientMixin

具體實現以下:ui

import 'package:flutter/material.dart';

class AppletPage extends StatefulWidget {
  //構造函數
  AppletPage({Key key}) : super(key: key);

  @override
  _AppletPageState createState() => _AppletPageState();
}

class _AppletPageState extends State<AppletPage>
    with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true; // 返回true

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("小程序"),
          backgroundColor: Colors.blue, //設置appbar背景顏色
          centerTitle: true, //設置標題是否局中
        ),
        body: new Center(
          child: new Text('敬請期待'),
        ),
      ),
    );
  }
}
相關文章
相關標籤/搜索