真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Flutter怎么用

這篇文章給大家分享的是有關(guān)Flutter怎么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站制作、成都網(wǎng)站設(shè)計的網(wǎng)絡(luò)公司。作為專業(yè)網(wǎng)站制作公司,創(chuàng)新互聯(lián)公司依托的技術(shù)實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設(shè)、全網(wǎng)整合營銷推廣及網(wǎng)站設(shè)計開發(fā)服務(wù)!


1. 前言

在初學(xué)新技術(shù)之前,我們總會要從最基本的東西了解起來,就好比當(dāng)接觸Android的時候,我們學(xué)四大組件都要學(xué)好久,是否還記得在Android的生命周期?首先讓我們回顧下Android中的生命周期

Flutter怎么用

關(guān)于這個就不在多說了,常用場景總結(jié)下:

  1.啟動Activity:系統(tǒng)會先調(diào)用onCreate方法,然后調(diào)用onStart方法,最后調(diào)用onResume,Activity進入運行狀態(tài)。
  2.當(dāng)前Activity被其他Activity覆蓋其上或被鎖屏:系統(tǒng)會調(diào)用onPause方法,暫停當(dāng)前Activity的執(zhí)行。
  3.當(dāng)前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏:系統(tǒng)會調(diào)用onResume方法,再次進入運行狀態(tài)。
  4.當(dāng)前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏,自身退居后臺:系統(tǒng)會先調(diào)用onPause方法,然后調(diào)用onStop方法,進入停滯狀態(tài)。
  5.用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法,最后調(diào)用onResume方法,再次進入運行狀態(tài)。
  6.當(dāng)前Activity處于被覆蓋狀態(tài)或者后臺不可見狀態(tài),即第2步和第4步,系統(tǒng)內(nèi)存不足,殺死當(dāng)前Activity,而后用戶退回當(dāng)前Activity:再次調(diào)用onCreate方法、onStart方法、onResume方法,進入運行狀態(tài)。
  7.用戶退出當(dāng)前Activity:系統(tǒng)先調(diào)用onPause方法,然后調(diào)用onStop方法,最后調(diào)用onDestory方法,結(jié)束當(dāng)前Activity。

emmm,相信小伙伴們現(xiàn)在應(yīng)該記憶起來了吧,前戲好了,進入主題,聊聊我們今天的主人公"State"。

2. Widget概念
在我們的主人公出場前,先認識下他的小伙伴

  Flutter中幾乎所有的對象都是一個Widget,與原生開發(fā)中“控件”不同的是,
  Flutter中的widget的概念更廣泛,它不僅可以表示UI元素,也可以表示一些功能性的組件如:用于手勢檢測的 GestureDetector widget、用于應(yīng)用主題數(shù)據(jù)傳遞的Theme等等。
而原生開發(fā)中的控件通常只是指UI元素

3. State的引入

  • StatelessWidget(用于不需要維護狀態(tài)的場景)

  abstract class StatelessWidget extends Widget
  • StatefulWidget(用于需要維護狀態(tài)的場景)

  abstract class StatefulWidget extends Widget

從上述的代碼中我們看到他們都繼承了一個東西Widget,那就先簡單的看下這個類

  @immutable
  abstract class Widget extends DiagnosticableTree {    const Widget({ this.key });    final Key key;    @protected
    Element createElement();    @override
    String toStringShort() {      return key == null ? '$runtimeType' : '$runtimeType-$key';
    }    @override
    void debugFillProperties(DiagnosticPropertiesBuilder properties) {      super.debugFillProperties(properties);
      properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;
    }    static bool canUpdate(Widget oldWidget, Widget newWidget) {      return oldWidget.runtimeType == newWidget.runtimeType
          && oldWidget.key == newWidget.key;
    }
  }

上述代碼中有一個我們很常見的方法,每次在繼承的時候都需要重寫的一個方法

  @override
  StatefulElement createElement() => StatefulElement(this);

繼續(xù)跟蹤StatefulElement發(fā)現(xiàn)存在一個widget.createState()方法,發(fā)現(xiàn)了就要繼續(xù),寧殺錯,莫放過

  class StatefulElement extends ComponentElement {    /// Creates an element that uses the given widget as its configuration.
    StatefulElement(StatefulWidget widget)
        : _state = widget.createState(),          super(widget) {
     .....      assert(_state._element == null);
      _state._element = this;      assert(_state._widget == null);
      _state._widget = widget;      assert(_state._debugLifecycleState == _StateLifecycle.created);
    }

點擊createState方法我們終于找到了今天的主人公,沒錯,就是它,State,跑不掉了。

  @protected
  State createState();
  1. 生命周期 到了現(xiàn)在這一步,我們已經(jīng)找到想要的了,正如前面所說,Android有自己的生命周期,那么作為Flutter也有自己獨特的生命周期

    Flutter怎么用

嗯,我一眼就看到了initState這個方法,還記得在網(wǎng)絡(luò)請求的時候亦或是變量的初始化,總是要寫到這個方法里面

  @override
 void initState() {   // TODO: implement initState
   super.initState();
   _loadItemPage();
 }

我們可以將上述方法分為三個部分進行描述,見下圖:

Flutter怎么用

大致可以看成三個階段

  •  初始化(插入渲染樹)

  • 構(gòu)造函數(shù)

  不屬于生命周期,因為這個時候State的widget屬性為空,此時無法在構(gòu)造函數(shù)中訪問widget屬性
  • initState

   /// Called when this object is inserted into the tree.
  這個函數(shù)在生命周期中只調(diào)用一次。這里可以做一些初始化工作,比如初始化State的變量
  • didChangeDependencies

   /// Called when a dependency of this [State] object changes.
  這個函數(shù)會緊跟在initState之后調(diào)用
  •  狀態(tài)改變(在渲染樹中存在)

  • didUpdateWidget

  /// Called whenever the widget configuration changes.
  當(dāng)組件的狀態(tài)改變的時候就會調(diào)用didUpdateWidget,比如調(diào)用了setStat
  •  銷毀(從渲染樹種移除)

  • deactivate

/// Called when this object is removed from the tree.在dispose之前,會調(diào)用這個函數(shù)。
復(fù)制代碼
  • dispose

  /// Called when this object is removed from the tree permanently.
  一旦到這個階段,組件就要被銷毀了,這個函數(shù)一般會移除監(jiān)聽,清理環(huán)境。

這個函數(shù)在生命周期中只調(diào)用一次。這里可以做一些初始化工作,比如初始化State的變量。

大體這樣吧,最后來個圖表總結(jié)下

階段調(diào)用次數(shù)是否支持setState
構(gòu)造函數(shù)1
initState1支持但無效(使用setState和不使用一樣)
didChangeDependencies>=1支持但無效
didUpdateWidget>=1支持但無效
deactivate>=1
dispose1
  1. 示例分析 可能有人會說,bb了那么久,毛都沒看到一根,所以講了這么多,不來點實際的怎么對的住之前的bb呢?來人啊,上代碼

  import 'package:flutter/material.dart';  class LifeState extends StatefulWidget {    @override
    _lifeStates createState() => _lifeStates();
  }  class _lifeStates extends State {    @override
    void initState() {      // TODO: implement initState
      super.initState();
      print('initState');
    }    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
      print(state.toString());
    }    @override
    void didChangeDependencies() {      // TODO: implement didChangeDependencies
      super.didChangeDependencies();
      print('didChangeDependencies');
    }    @override
    void didUpdateWidget(LifeState oldWidget) {      super.didUpdateWidget(oldWidget);
      print('didUpdateWidget');
    }    @override
    Widget build(BuildContext context) {
      print('build');      // TODO: implement build
      return MaterialApp(
        home: Center(
            child: GestureDetector(
          child: new Text('lifeCycle'),
          onTap: () {
            Navigator.of(context)
              .  push(new MaterialPageRoute(builder: (BuildContext c) {              return new Text('sdfs');
            }));
          },
        )),
      );
    }    @override
    void reassemble() {      // TODO: implement reassemble
      super.reassemble();
      print('reassemble');
    }    @override
    void deactivate() {      // TODO: implement deactivate
      super.deactivate();
      print('deactivate');
    }    @override
    void dispose() {      // TODO: implement dispose
      super.dispose();
      print('dispose');
    }
  }

測試結(jié)果

  1. 創(chuàng)建widget

  initState
  didChangeDependencies
  build
  1. 退出頁面

  deactivate
  dispose
  1. 點擊熱加載按鈕

  reassemble
  didUpdateWidget
  build
  1. app從顯示到后臺(home鍵)

  AppLifecycleState.inactive
  AppLifecycleState.paused
  1. app從后臺回到前臺

  AppLifecycleState.inactive
  AppLifecycleState.resumed

感謝各位的閱讀!關(guān)于“Flutter怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


本文標題:Flutter怎么用
標題URL:http://weahome.cn/article/jpsdee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部