<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Flutter2.*_狀態(tài)管理

          共 3097字,需瀏覽 7分鐘

           ·

          2021-11-01 18:51

          ????Flutter以widget作為的基礎(chǔ),分為有狀態(tài)和無狀態(tài)兩類,可以簡單以是否存在交互為判斷依據(jù),不存在則為無狀態(tài)組件Statelesswige,否則即有狀態(tài)組件StatefulWidget,二者皆繼承與父類Widget。今天我們來聊一下有狀態(tài)組件的狀態(tài)管理。


          ????flutter有多種辦法管理狀態(tài),作為開發(fā)者,需要定義管理的方法,如果眼下對于此中的規(guī)則不清楚,可以默認在父類widget中管理狀態(tài)。細致來說,根據(jù)具體地開發(fā)情況,有三種思路管理狀態(tài):widget管理自己的狀態(tài)、父widget管理此widget的狀態(tài)、混搭管理,決定此三種選擇哪一個,可以參考原則:

          ????· 若狀態(tài)是用戶數(shù)據(jù),如復(fù)選框選中、滑塊位置,狀態(tài)由父widget管理;

          ????·若所討論的狀態(tài)與界面外觀,則widget本身管理狀態(tài);


          自身管理狀態(tài):

          class?MyApp?extends?StatelessWidget?{
          ??const?MyApp({Key??key})?:?super(key:?key);

          ??@override??Widget?build(BuildContext?context)?{
          ????return?MaterialApp(
          ??????title:?'Flutter?Demo',
          ??????home:?Scaffold(
          ????????appBar:?AppBar(
          ??????????title:?const?Text('Flutter?Demo'),
          ????????),
          ????????body:?const?Center(
          ??????????child:?TapboxA(),
          ????????),
          ??????),
          ????);
          ??}}


          class?TapboxA?extends?StatefulWidget?{
          ??const?TapboxA({Key??key})?:?super(key:?key);

          ??@override
          ??_TapboxAState?createState()?=>?_TapboxAState();}class?_TapboxAState?extends?State?{
          ??bool?_active?=?false;

          ??void?_handleTap()?{
          ????setState(()?{
          ??????_active?=?!_active;
          ????});
          ??}

          ??@override??Widget?build(BuildContext?context)?{
          ????return?GestureDetector(
          ??????onTap:?_handleTap,
          ??????child:?Container(
          ????????child:?Center(
          ??????????child:?Text(
          ????????????_active???'Active'?:?'Inactive',
          ????????????style:?const?TextStyle(fontSize:?32.0,?color:?Colors.white),
          ??????????),
          ????????),
          ????????width:?200.0,
          ????????height:?200.0,
          ????????decoration:?BoxDecoration(
          ??????????color:?_active???Colors.lightGreen[700]?:?Colors.grey[600],
          ????????),
          ??????),
          ????);
          ??}}



          父widget管理widget狀態(tài),此種場景一般用在當(dāng)前組件是無狀態(tài)的,需要父類widget來進行識別作為子組件的目標(biāo)是否要執(zhí)行不同條件對應(yīng)的邏輯,來看下列示例代碼:

          class?TapboxB?extends?StatelessWidget?{
          ??const?TapboxB({
          ????Key??key,
          ????this.active?=?false,
          ????required?this.onChanged,
          ??})?:?super(key:?key);

          ??final?bool?active;
          ??final?ValueChanged?onChanged;

          ??void?_handleTap()?{
          ????onChanged(!active);
          ??}

          ??@override??Widget?build(BuildContext?context)?{
          ????return?GestureDetector(
          ??????onTap:?_handleTap,
          ??????child:?Container(
          ????????child:?Center(
          ??????????child:?Text(
          ????????????active???'Active'?:?'Inactive',
          ????????????style:?const?TextStyle(fontSize:?32.0,?color:?Colors.white),
          ??????????),
          ????????),
          ????????width:?200.0,
          ????????height:?200.0,
          ????????decoration:?BoxDecoration(
          ??????????color:?active???Colors.lightGreen[700]?:?Colors.grey[600],
          ????????),
          ??????),
          ????);
          ??}}

          作為子組件的TapboxB為無狀態(tài)組件,在接收點擊事件通過onChanged通知父組件 ParentWidget,ParentWidget以_handleTapboxChanged接收的value更新設(shè)置TapboxB屬性_active,同時更新widget樹渲染頁面。

          class?ParentWidget?extends?StatefulWidget?{
          ??const?ParentWidget({Key??key})?:?super(key:?key);

          ??@override
          ??_ParentWidgetState?createState()?=>?_ParentWidgetState();}class?_ParentWidgetState?extends?State?{
          ??bool?_active?=?false;

          ??void?_handleTapboxChanged(bool?newValue)?{
          ????setState(()?{
          ??????_active?=?newValue;
          ????});
          ??}

          ??@override??Widget?build(BuildContext?context)?{
          ????return?SizedBox(
          ??????child:?TapboxB(
          ????????active:?_active,
          ????????onChanged:?_handleTapboxChanged,
          ??????),
          ????);
          ??}}



          ? ? 混合管理即為組件自管理和父類組件管理子組件狀態(tài)的組合使用,flutter提供各種按鈕和類似的交互式widget,可以參考material design gudelines.

          ? ? 感謝各位抽出時間閱讀,如果各位對此有新的想法和疑問,歡迎留言探討,或者通過下面二維碼進群討論學(xué)習(xí)。

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  户外一区二区骚屄 | 国产精品久久久久久久久久小说 | 在线三级片视频 | 美女被艹视频网站 | 韩国免费一区二区三区 |