最近应邀票圈小伙伴躺坑Flutter,项目初步雏形完结。以原来的工具链版本为基础做了Flutter版本,不过后面还是需要优化下项目接入Redux,以及扩展一些Native方法。

这里记录一下在开发过程中碰到的一些小问题。

首先是搭建Tab的时候,切换tab子页面,上一个页面会被释放,导致切换回来时会重新触发initState等生命周期(网络请求是放在这个里面的)

问了一下前同事:“需要使用 bool get wantKeepAlive => true;”,于是网上搜了一下这个玩意儿,以及其他解决方案。

首先说说使用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

具体实现如下:

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('敬请期待'),
),
),
);
}
}

Flutter踩坑日记:Tab导航栏保持子页面状态的更多相关文章

  1. Flutter踩坑日记:解除依赖

    Flutter已经融入工程有一段时间了,由于团队人数较少,所以一直没有管和原有工程解依赖的问题,今天有时间正好把这个问题给搞了. 一.分析 首先,直接忽略上一篇<接入现有iOS项目>的所有 ...

  2. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

  3. Laya 踩坑日记 ---A* 导航寻路

    要做寻路,然后看了看laya 官方的例子,感觉看的一脸懵逼,早了半天的api 也没找到在哪有寻路的,最后一看代码,原来是用的github上的A星方案  https://github.com/bgrin ...

  4. Flutter - TabBar导航栏切换后,状态丢失

    上一篇讲到了 Flutter - BottomNavigationBar底部导航栏切换后,状态丢失 里面提到了TabBar,这儿专门再写一下吧,具体怎么操作,来不让TabBar的状态丢失.毕竟大家99 ...

  5. AI相关 TensorFlow -卷积神经网络 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  6. 人工智能(AI)库TensorFlow 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  7. hexo博客谷歌百度收录踩坑日记

    title: hexo博客谷歌百度收录踩坑日记 toc: false date: 2018-04-17 00:09:38 百度收录文件验证 无论怎么把渲染关掉或者render_skip都说我的格式错误 ...

  8. 【Android - 自定义View】之自定义颜色渐变的Tab导航栏

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 GradientTab ,继承自View类: (2)这个自定义View实现了颜色渐变的Tab导航栏(仿微信主菜单),用户在左右滑 ...

  9. Hexo搭建静态博客踩坑日记(二)

    前言 Hexo搭建静态博客踩坑日记(一), 我们说到利用Hexo快速搭建静态博客. 这节我们就来说一下主题的问题与主题的基本修改操作. 起步 chrome github hexo git node.j ...

随机推荐

  1. kepware http接口 c语言 python

    读取某变量的值(http.client import http.client conn = http.client.HTTPConnection("127,0,0,1") head ...

  2. Hdu1016 Prime Ring Problem(DFS) 2016-05-06 14:27 329人阅读 评论(0) 收藏

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. 初始MapReduce

    MapReduce 概述 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用"的核心框架 MapReduce核心功能是将用户编写的业务逻辑代码和自带 ...

  4. java基础知识-数据类型及转换

    1.java中的常量大体分为两种: <1>字面量常量 <2>自定义常量 2.java中常量(字面量)的分类:<1>,整数常量:直接出现的整数<2>,小数 ...

  5. http发送请求方式;分为post和get两种方式

    http发送请求方式:分为post和get两种方式

  6. sql解决避免除以零的错误

    在实际项目中,我们可能会遇到求百分比,比值等带除法的sql语句.这时,我们也许会遇到分母为零的情况.下面给出我总结的一些方法: 1. 用NULLIF函数: 首先说一下NULLIF函数的语法: NULL ...

  7. NET npoi 保存文件

    npoi完整代码:NET npoi帮助类 public static void DataTableToExcel(List<DataTable> dataTables, string fi ...

  8. Easyui datagrid绑定数据,新增,修改,删除方法(一)

    @{ ViewBag.Title = "UsersList"; } <script type="text/javascript"> $(functi ...

  9. codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

    一前言 这是我的处女作,写的不好的地方还望指出共同讨论.EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立.本人之前学习的.n ...

  10. jsp的两个include了解

    在jsp中三大指令(page --  include -- taglib)中有一个 include 然后再三个动作标签中(include -- forward -- param)中也有一个includ ...