最近應邀票圈小夥伴躺坑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; }); } }
根據官網的要求:優化
PageView
的children須要繼承自 StatefulWidget
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('敬請期待'), ), ), ); } }