flutter中的生命週期

前言

和其餘的視圖框架好比android的Activity同樣,flutter中的視圖Widget也存在生命週期,生命週期的回調函數提如今了State上面。理解flutter的生命週期,對咱們寫出一個合理的控件相當重要。組件State的生命週期整理以下圖所示:android

大體能夠當作三個階段框架

  • 初始化(插入渲染樹)
  • 狀態改變(在渲染樹中存在)
  • 銷燬(從渲染樹種移除)

各個函數

構造函數

這個函數不屬於生命週期,由於這個時候State的widget屬性爲空,若是要在構造函數中訪問widget的屬性是行不通的。可是構造函數必然是要第一個調用的。ide

initState

/// Called when this object is inserted into the tree.

當插入渲染樹的時候調用,這個函數在生命週期中只調用一次。這裏能夠作一些初始化工做,好比初始化State的變量。函數

didChangeDependencies

/// Called when a dependency of this [State] object changes.

這個函數會緊跟在initState以後調用,而且能夠調用BuildContext.inheritFromWidgetOfExactType,那麼BuildContext.inheritFromWidgetOfExactType的使用場景是什麼呢?最經典的應用場景是ui

new DefaultTabController(length: 3, child: new TabBar(
      tabs: [ "主頁","訂單","個人" ]
      .map( (data)=>new Text(data) ).toList(),

TabBar原本須要定義一個TabController,可是在外面套一層DefaultTabController就不須要定義TabContrller了,看下源碼:this

@override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _updateTabController();
    _initIndicatorPainter();
  }

void _updateTabController() {
    final TabController newController = widget.controller ?? DefaultTabController.of(context);
    ...

注意到這裏DefaultTabController.of(context)spa

static TabController of(BuildContext context) {
    final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);
    return scope?.controller;
  }

實際上就是調用BuildContext.inheritFromWidgetOfExactType,也就說在didChangeDependencies中,能夠跨組件拿到數據。3d

didUpdateWidget

/// Called whenever the widget configuration changes.

當組件的狀態改變的時候就會調用didUpdateWidget,好比調用了setState.code

實際上這裏flutter框架會建立一個新的Widget,綁定本State,並在這個函數中傳遞老的Widget。blog

這個函數通常用於比較新、老Widget,看看哪些屬性改變了,並對State作一些調整。

須要注意的是,涉及到controller的變動,須要在這個函數中移除老的controller的監聽,並建立新controller的監聽。

好比仍是TabBar:

deactivate

/// Called when this object is removed from the tree.

在dispose以前,會調用這個函數。

dispose

/// Called when this object is removed from the tree permanently.

一旦到這個階段,組件就要被銷燬了,這個函數通常會移除監聽,清理環境。

仍是TabBar:

總結一下

階段 調用次數 是否支持setState
構造函數 1
initState 1 無效(使用setState和不使用同樣)
didChangeDependencies >=1 無效
didUpdateWidget >=1 無效
deactivate >=1
dispose 1
相關文章
相關標籤/搜索