Flutter 基礎元件 狀態管理

2022-06-27 09:09:11 字數 2791 閱讀 3959

乙個永恆的主題,「狀態(state)管理」,無論是在react/vue(兩者都是支援響應式程式設計的web開發框架)還是flutter中,他們討論的問題和解決的思想都是一致的。

乙個問題,statefulwidget的狀態應該被誰管理?widget本身?父widget?都會?還是另乙個物件?答案是取決於實際情況!以下是管理狀態的最常見的方法

widget管理自己的狀態。

widget管理子widget狀態。

混合管理(父widget和子widget都管理狀態)。

如何決定使用哪種管理方法?下面是官方給出的一些原則

如果狀態是使用者資料,如核取方塊的選中狀態、滑塊的位置,則該狀態最好由父widget管理。

如果狀態是有關介面外觀效果的,例如顏色、動畫,那麼狀態最好由widget本身來管理。

如果某乙個狀態是不同widget共享的則最好由它們共同的父widget管理。

下面通過三個例子來分別說明這三種管理方式。

_tapboxastate 類:

class tapboxa extends statefulwidget ) : super(key: key);

@override

_tapboxastate createstate() => _tapboxastate();

}class _tapboxastate extends state);

} widget build(buildcontext context)

}

對於父widget來說,管理狀態並告訴其子widget何時更新通常是比較好的方式。

例如,iconbutton是乙個圖示按鈕,但它是乙個無狀態的widget,因為我們認為父widget需要知道該按鈕是否被點選來採取相應的處理。

parentwidgetstate 類:

為tapboxb 管理_active狀態。

實現_handletapboxchanged(),當盒子被點選時呼叫的方法。

當狀態改變時,呼叫setstate()更新ui。

tapboxb 類:

繼承statelesswidget類,因為所有狀態都由其父元件處理。

當檢測到點選時,它會通知父元件。

tapboxb通過**將其狀態匯出到其父元件,狀態由父元件管理,因此它的父元件為statefulwidget。

但是由於tapboxb不管理任何狀態,所以tapboxb為statelesswidget。

class parentwidgetb extends statefulwidget 

class _parentwidgetbstate extends state);

} @override

widget build(buildcontext context)

}class tapboxb extends statelesswidget ): super(key: key);

final bool active;

final valuechangedonchanged;

void _handletap()

@override

widget build(buildcontext context)

}

tapboxc示例中,手指按下時,盒子的周圍會出現乙個深綠色的邊框,抬起時,邊框消失。

點選完成後,盒子的顏色改變。tapboxc將其_active狀態匯出到其父元件中,但在內部管理其_highlight狀態。

這個例子有兩個狀態物件_parentwidgetstate和_tapboxcstate。

_parentwidgetstatec類:

管理_active 狀態。

實現 _handletapboxchanged() ,當盒子被點選時呼叫。

當點選盒子並且_active狀態改變時呼叫setstate()更新ui。

_tapboxcstate 物件:

管理_highlight 狀態。

gesturedetector監聽所有tap事件。當使用者點下時,它新增高亮(深綠色邊框);當使用者釋放時,會移除高亮。

當按下、抬起、或者取消點選時更新_highlight狀態,呼叫setstate()更新ui。

當點選時,將狀態的改變傳遞給父元件。

class parentwidgetc extends statefulwidget 

class _parentwidgetcstate extends state);

} @override

widget build(buildcontext context)

}class tapboxc extends statefulwidget ): super(key: key);

final bool active;

final valuechangedonchanged;

_tapboxcstate createstate() => _tapboxcstate();

}class _tapboxcstate extends state);

} void _handletapup(tapupdetails details) );

} void _handletapcancel() );

} void _handletap()

@override

widget build(buildcontext context)

}

使用一些專門用於狀態管理的包,如provider、redux等。

Flutter狀態管理初探

本篇文章的主要內容是對flutter中狀態管理的方式及不同方式的選擇進行介紹。本文首發於我的個人部落格 技術公館 wcc.im flutter狀態管理初探 常見的狀態管理方式有三種,分別是由widget自身進行管理,由父widget進行管理和由widget自身及父widget混合進行管理。在對三種常...

Flutter區域性狀態管理

如前面所說,它其實對子widget進行了一次包裝,提供data,proxywidget定義了如何包裝widget inheritedwidget proxywidget widget 在widget樹建立的時候,會通過builderowner建立inheritedelement,由inherited...

Flutter 狀態管理 實踐記錄

flutter裡面最重要的應該就是 狀態管理剛開始做的乙個問題,statefulwidget的狀態應該被誰管理?widget本身?父widget?還是其他物件?以下是管理狀態的最常見的方法 舉個例子 比如 checkbox 裡面的資料到底是給誰管理比較方便 官方的原則是 因此,如果是checkbox...