Flutter主要有兩種:無狀態的 StatelessWidget和有狀態的 StatefulWidget
一個 StatelessWidget 是不能被改變的,好比:Icon、Text等。因爲不可改變,所以並無什麼生命週期。less
一個 StatefulWidget 是有狀態的,可變的。一個 StatefulWidget 組件能夠經過定義它的 State 來進行對組件數據狀態的存儲和修改。那麼它的State應該是有一系列的生命週期。async
上圖就是 State 的生命週期圖。ide
⚠️注意,重寫的時候必需要調用 super.deactivate()。函數
⚠️注意,重寫的時候必需要調用 super.dispose()。字體
Flutter裏面的路由主要是經過Navigator這個類進行控制的,當你想從這個頁面跳到另一個頁面的時候,經過Navigator便可
⚠️調用的時候要注意頁面是入棧操做,千萬別累積了太多的頁面
這裏爲了更加直觀的展現路由之間的跳轉和轉換,我將我項目裏面封裝的一個NavigatorUtils的代碼展示出來ui
import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_xinqiu/page/home_page.dart'; import 'package:flutter_xinqiu/page/login_page.dart'; import 'package:flutter_xinqiu/page/noob_setting_page.dart'; import 'package:flutter_xinqiu/page/user_idea_page.dart'; import 'package:flutter_xinqiu/widget/custom_route.dart'; /** * 路由跳轉 * Created by xiaocheng123 * Date: 2019-7-8 */ class NavigatorUtils { ///替換 static pushReplacementNamed(BuildContext context, String routeName) { Navigator.pushReplacementNamed(context, routeName); } ///切換無參數頁面 static pushNamed(BuildContext context, String routeName) { Navigator.pushNamed(context, routeName); } ///主頁 static goHome(BuildContext context) { Navigator.pushReplacementNamed(context, HomePage.sName); } ///登陸頁 static goLogin(BuildContext context) { // Navigator.pushReplacementNamed(context, LoginPage.sName); Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (context) => new LoginPage() ), (route) => route == null); } ///新手設置頁面 static goNoobSetting(BuildContext context) { Navigator.of(context).push(CustomRoute(NoobSettingPage())); } ///意見反饋設置頁面 static goUserIdea(BuildContext context) { Navigator.push(context, new CupertinoPageRoute(builder: (context) => pageContainer(UserIdeaPage()))); } ///公共打開方式 static NavigatorRouter(BuildContext context, Widget widget) { return Navigator.push(context, new CupertinoPageRoute(builder: (context) => pageContainer(widget))); } ///Page頁面的容器,作一次通用自定義 static Widget pageContainer(widget) { return MediaQuery( ///不受系統字體縮放影響 data: MediaQueryData.fromWindow(WidgetsBinding.instance.window) .copyWith(textScaleFactor: 1), child: widget); } }
在代碼裏面能夠將跳轉到某個路由進行封裝起來,這樣進行路由跳轉的時候直接引用便可idea