Flutter知識(shí)積累

1 mounted:判斷頁(yè)面是否被釋放,如果釋放了就不進(jìn)行渲染

if (mounted) {
  setState(() {
  });
}


2 GlobalKey的使用:

final GlobalKey<_UserInfoItemState> _globalKey = GlobalKey();

final String? userName = _globalKey.currentState?.widget.userName;

final String? userPhone = _globalKey.currentState?.userPhone;

3 安卓設(shè)備啟動(dòng)圖片的大小

mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
320*480
480*800
720*1280
1080*1920
3840*2160
4 斷言assert 

如果assert 的判斷為true, 則繼續(xù)執(zhí)行下面的語(yǔ)句。反之拋出一個(gè)異常弥姻。

5 計(jì)算Text內(nèi)容高度TextPainter

  double get descInfoHeight {
    final TextPainter painter = TextPainter(
      locale: WidgetsBinding.instance!.window.locale,
      maxLines: 2,
      textDirection: TextDirection.ltr,
      text: TextSpan(
        text: "",
        style: TextStyle(
          color: const Color(0xFF666666),
          fontSize: 14.sp,
          fontWeight: FontWeight.w500,
        ),
      ),
    );
    painter.layout(maxWidth: 170.w);
    return painter.height;
  }

6 計(jì)算item內(nèi)容高度

  void calculateContentHeight() {
    Future<void>.delayed(const Duration(), () {
      if (!mounted) {
        return;
      }
      final RenderBox renderBox = context.findRenderObject() as RenderBox;
      print("width = ${renderBox.size.width}, height = ${renderBox.size.height}");
    });
  }

7 const和final

const:賦值的內(nèi)容必須在編譯時(shí)已經(jīng)確定

final:賦值時(shí)缅疟,可以動(dòng)態(tài)獲取筹煮,賦值的內(nèi)容在運(yùn)行時(shí)已經(jīng)確定

8 dynamic和Object

dynamic調(diào)用方法時(shí)助泽,編譯不會(huì)報(bào)錯(cuò)熬北,運(yùn)行時(shí)存在安全隱患

Object類型富玷,調(diào)用方法時(shí)介时,編譯會(huì)報(bào)錯(cuò)

9 Dart語(yǔ)法:

Dart是單線程的

 Dart中的函數(shù)不支持方法重載

10
設(shè)置高斯模糊 ImageFiltered

 SizeBox 設(shè)置水平方向、垂直方向的間距

用三個(gè)單引號(hào)表示多行字符串 '''         ‘’'

集合類型Set:元素?zé)o序凌彬,不重復(fù)


11 ??=  賦值操作 
    
當(dāng)變量有值沸柔,使用自己的值

當(dāng)變量為null,使用后面的內(nèi)容進(jìn)行賦值
    
12 級(jí)聯(lián)語(yǔ)法:

final p2 = Person()
           ..name = "why"
           ..run()
           ..eat()
           ..swim();

final p1 = Person();
p1.name = 'why’;
p1.run();
p1.eat();
p1.swim();
  
13 await
await 關(guān)鍵字必須在 async 函數(shù)內(nèi)部使用

14 設(shè)置頭像圓角

CircleAvatar
    
ClipOval

ClipRRect
    
Container + BoxDecoration + DecorationImage

15 CustomScrollView

slivers
    SliverAppBar
    SliverGrid
    SliverList

16  檢測(cè)左上角的返回操作
  
外層包裝一層WillPopScope铲敛,實(shí)現(xiàn)onWillPop方法

 返回為true: 使用系統(tǒng)提供的返回方法

返回為false:自定義返回方法
   
17 Icon 字體圖標(biāo)和圖片圖標(biāo)

字體圖標(biāo)矢量圖放大后不會(huì)失真

字體圖標(biāo)可以設(shè)置顏色

字體圖標(biāo)很多時(shí)褐澎,占據(jù)空間較小

18 build方法的執(zhí)行時(shí)機(jī):

Widget build(BuildContext context)

返回界面進(jìn)行渲染的Widget

當(dāng)Widget第一次被創(chuàng)建;當(dāng)父Widget發(fā)生改變伐蒋,子Widget會(huì)被重新構(gòu)建

19 mixin混入

 mixin 關(guān)鍵字定義一個(gè)類工三,其他類通過with關(guān)鍵字進(jìn)行混入迁酸。

with 非必須實(shí)現(xiàn)方法,可以不實(shí)現(xiàn)mixin類中已經(jīng)實(shí)現(xiàn)的方法

Dart為了支持多重繼承俭正,引入了mixin關(guān)鍵字奸鬓,mixin就相當(dāng)于將其他類的能力混入到當(dāng)前類,唯一的限制就是mixin類無(wú)法擁有構(gòu)造函數(shù)掸读。這樣可以避免混入多個(gè)類時(shí)串远,父類構(gòu)造方法的調(diào)用沖突。
 
20 隱式接口

 implements實(shí)現(xiàn)多個(gè)抽象類儿惫、普通類

implements 必須實(shí)現(xiàn)方法
    
可實(shí)現(xiàn)抽象類澡罚,普通類(多實(shí)現(xiàn),實(shí)現(xiàn)多個(gè)類肾请、抽象類)
    
一個(gè)類通過implements實(shí)現(xiàn)多個(gè)抽象類留搔,必須實(shí)現(xiàn)抽象類的所有方法(未實(shí)現(xiàn)和已實(shí)現(xiàn)的方法)
   
21 extends

繼承,可繼承抽象類铛铁、普通類(單繼承隔显,只能繼承一個(gè)類)
    
22 抽象類

關(guān)鍵字修飾:abstract
    
抽象類不能初始化
 
抽象類中的抽象方法必須被子類實(shí)現(xiàn)
  
抽象類中已經(jīng)實(shí)現(xiàn)的方法可以不被子類重寫
    
23 常量構(gòu)造方法

const 修飾

常量構(gòu)造方法的類中,所有成員變量必須是final修飾
    
24 工廠構(gòu)造方法

 factory關(guān)鍵字修飾
    
可以手動(dòng)返回一個(gè)對(duì)象
   
25 getter饵逐、setter方法

返回值類型 get get方法名 { 方法體 }

set set方法名(參數(shù)) { 方法體 }

26 debug模式

斷言是有效的

服務(wù)擴(kuò)展是有效的

debugging是有效的

flutter run運(yùn)行

27 release模式

斷言是無(wú)效的

服務(wù)擴(kuò)展是無(wú)效的

debugging是無(wú)效的

flutter run —release

28 StatefulWidget的生命周期:

StatefulWidget的構(gòu)造函數(shù)調(diào)用

StatefulWidget的createState調(diào)用

State的構(gòu)造函數(shù)調(diào)用

State的initState調(diào)用

State的didChangeDependencies調(diào)用

State的build調(diào)用

State的dispose調(diào)用

29 try  catch  finally

num stringConvertNum(String str) {

  num result = 0;

  try {

    result = num.parse(str);

  } on FormatException catch (e) {

    print("發(fā)生Format異常 ${e.toString()}”);

  } finally {

    print("禁止程序崩潰");
  }

  print("result = $result”);

  return result;
}

30 子類和父類構(gòu)造函數(shù)調(diào)用順序 

先調(diào)用父類的構(gòu)造方法括眠,再調(diào)用子類的構(gòu)造方法

31 Dart 中 num 類型分為 int 和 double ,沒有float 類型梳毙。

Dart 中 if 等語(yǔ)句只支持 bool 類型

32 強(qiáng)類型語(yǔ)言

Dart屬于是強(qiáng)類型語(yǔ)言哺窄,但可以用var來(lái)聲明變量,Dart會(huì)自推導(dǎo)出數(shù)據(jù)類型账锹。

var 實(shí)際上是編譯期的“語(yǔ)法糖”萌业。 

dynamic表示動(dòng)態(tài)類型,被編譯后實(shí)際是一個(gè)object類型奸柬,在編譯期間不進(jìn)行任何的類型檢查生年,而是在運(yùn)行期進(jìn)行類型檢查。

33 Dart中一切都是對(duì)象

在Dart中一切都是對(duì)象廓奕,所有的對(duì)象都繼承自O(shè)bject抱婉。

Dart是強(qiáng)類型語(yǔ)言,但可以用var或dynamic來(lái)聲明一個(gè)變量桌粉,Dart會(huì)自動(dòng)推斷其數(shù)據(jù)類型蒸绩。
 
Dart沒有public protected private等關(guān)鍵字,如果某個(gè)變量以下劃線(_)開頭铃肯,代表這個(gè)變量在庫(kù)中是私有的患亿。

34 Dart語(yǔ)言的特性:

a:Dart的語(yǔ)法清晰明了,工具簡(jiǎn)單但功能強(qiáng)大押逼。

b:容易上手步藕,充分吸收了高級(jí)語(yǔ)言特性

c:響應(yīng)式編程

d:執(zhí)行速度快惦界,Dart提供提前優(yōu)化編譯,在移動(dòng)設(shè)備和Web上快速啟動(dòng)咙冗。

e:易于移植沾歪,Dart可編譯成 ARM 和 X86 代碼,這樣Dart移動(dòng)應(yīng)用程序可以在 iOS雾消、Android 和其他地方運(yùn)行灾搏。

35 WidgetsBinding.instance.addPostFrameCallback

WidgetsBinding.instance.addPostFrameCallback(_onAfterRendering);

addPostFrameCallback 是 StatefulWidget 渲染結(jié)束的回調(diào),只會(huì)被調(diào)用一次仪或,之后 StatefulWidget 需要刷新 UI 也不會(huì)被調(diào)用确镊,

36 Dart的消息機(jī)制

Dart 在單線程中是以消息循環(huán)機(jī)制來(lái)運(yùn)行的士骤,其中包含兩個(gè)任務(wù)隊(duì)列范删,一個(gè)是“微任務(wù)隊(duì)列” microtask queue,另一個(gè)叫做“事件隊(duì)列” event queue拷肌。 

入口函數(shù) main() 執(zhí)行完后到旦,消息循環(huán)機(jī)制便啟動(dòng)了。

首先會(huì)按照先進(jìn)先出的順序逐個(gè)執(zhí)行微任務(wù)隊(duì)列中的任務(wù)巨缘,當(dāng)所有微任務(wù)隊(duì)列執(zhí)行完后便開始執(zhí)行事件隊(duì)列中的任務(wù)添忘,事件任務(wù)執(zhí)行完畢后再去執(zhí)行微任務(wù),如此循環(huán)往復(fù)若锁,生生不息搁骑。

37 判斷

final Brightness brightness1 = ThemeData.estimateBrightnessForColor(Colors.white);

Brightness.light

Brightness.dark

38 key

每個(gè)Widget都有唯一標(biāo)識(shí)key,

如果key作為參數(shù)傳入Widget里面,則會(huì)根據(jù)指定的名字生成key

在有些場(chǎng)景下需要保存key,并且通過key訪問該Widget

可以通過GlobalKey又固、LocalKey仲器、UniqueKey或ObjectKey進(jìn)行保存

使用場(chǎng)景:復(fù)制操作,刷新組件

39 WidgetsBinding.instance.addPostFrameCallback

addPostFrameCallback 是StatefulWidget 渲染結(jié)束的回調(diào),只會(huì)被調(diào)用一次仰冠,之后 StatefulWidget 需要刷新 UI 也不會(huì)被調(diào)用乏冀。

addPostFrameCallback 的使用方法是在 initState 里添加回調(diào):

void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) => {});
}

使用這個(gè)方法就可以在判斷渲染完成,并獲取到元素的大小洋只。

40 StatefulWidget - 生命周期

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

2 initState

3 didChangeDependencies

4 build

5 addPostFrameCallback

6 (組件狀態(tài)改變)didUpdateWidget

7 deactivate

8 dispose

showModalBottomSheet系統(tǒng)彈框

41 StatelessWidget - 生命周期

1 構(gòu)造函數(shù)初始化

2 提供build渲染

build 是用來(lái)創(chuàng)建 Widget 的辆沦,但因?yàn)?build 在每次界面刷新的時(shí)候都會(huì)調(diào)用,

所以不要在 build 里寫業(yè)務(wù)邏輯识虚,可以把業(yè)務(wù)邏輯寫到你的 StatelessWidget 的構(gòu)造函數(shù)里肢扯。


無(wú)狀態(tài)的Widget

無(wú)法提供setState修改組件的狀態(tài)

內(nèi)部屬性應(yīng)聲明為final,防止意外發(fā)生改變

42 App的生命周期

didChangeAppLifecycleState App生命周期發(fā)生變化

  切換后臺(tái):

  AppLifecycleState.inactive -> AppLifecycleState.paused
  
  @override
  void didChangeAppLifecycleState(AppLifecycleState state){
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
      // app退到后臺(tái)后, 刷新狀態(tài)
    }
  }

  切換前臺(tái):

  AppLifecycleState.inactive -> AppLifecycleState.resumed -> build

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    // app顯示后, 刷新狀態(tài)
    if (state == AppLifecycleState.resumed) {
      // 刷新代碼
    }
  }

43 組件移除

頁(yè)面銷毀的時(shí)候會(huì)依次執(zhí)行:

deactivate : State對(duì)象從樹中被移除時(shí)

dispose: State對(duì)象從樹中被永久移除時(shí)調(diào)用担锤;通常在此回調(diào)中釋放資源

44 GestureDetector處理手勢(shì)操作

HitTestBehavior.opaque 自己處理事件

 HitTestBehavior.deferToChild child處理事件


HitTestBehavior.translucent 自己和child都可以接收事件

45 時(shí)間戳獲取

final int timestamp = DateTime.now().millisecondsSinceEpoch;

46 捕獲Flutter framework異常

FlutterError.onError = (FlutterErrorDetails details) {


  LogPrint.d("捕獲Flutter framework異常 ${details.exception}");


  Zone.current.handleUncaughtError(details.exception, details.stack!);
};

在2022年5月5日 上午9:35:36出現(xiàn)沖突的修改:
1 mounted:判斷頁(yè)面是否被釋放蔚晨,如果釋放了就不進(jìn)行渲染

if (mounted) {
  setState(() {
  });
}


2 GlobalKey的使用:

final GlobalKey<_UserInfoItemState> _globalKey = GlobalKey();

final String? userName = _globalKey.currentState?.widget.userName;

final String? userPhone = _globalKey.currentState?.userPhone;

3 安卓設(shè)備啟動(dòng)圖片的大小

mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
320*480
480*800
720*1280
1080*1920
3840*2160
4 斷言assert 

如果assert 的判斷為true, 則繼續(xù)執(zhí)行下面的語(yǔ)句。反之拋出一個(gè)異常妻献。

5 計(jì)算Text內(nèi)容高度TextPainter

  double get descInfoHeight {
    final TextPainter painter = TextPainter(
      locale: WidgetsBinding.instance!.window.locale,
      maxLines: 2,
      textDirection: TextDirection.ltr,
      text: TextSpan(
        text: "",
        style: TextStyle(
          color: const Color(0xFF666666),
          fontSize: 14.sp,
          fontWeight: FontWeight.w500,
        ),
      ),
    );
    painter.layout(maxWidth: 170.w);
    return painter.height;
  }

6 計(jì)算item內(nèi)容高度

  void calculateContentHeight() {
    Future<void>.delayed(const Duration(), () {
      if (!mounted) {
        return;
      }
      final RenderBox renderBox = context.findRenderObject() as RenderBox;
      print("width = ${renderBox.size.width}, height = ${renderBox.size.height}");
    });
  }

7 const和final

const:賦值的內(nèi)容必須在編譯時(shí)已經(jīng)確定

final:賦值時(shí)蛛株,可以動(dòng)態(tài)獲取团赁,賦值的內(nèi)容在運(yùn)行時(shí)已經(jīng)確定

8 dynamic和Object

dynamic調(diào)用方法時(shí),編譯不會(huì)報(bào)錯(cuò)谨履,運(yùn)行時(shí)存在安全隱患

Object類型欢摄,調(diào)用方法時(shí),編譯會(huì)報(bào)錯(cuò)

9 Dart語(yǔ)法:

Dart是單線程的

 Dart中的函數(shù)不支持方法重載

設(shè)置高斯模糊 ImageFiltered


 SizeBox 設(shè)置水平方向笋粟、垂直方向的間距


用三個(gè)單引號(hào)表示多行字符串 '''         ‘’'




10 Set

集合類型Set:元素?zé)o序怀挠,不重復(fù)

11 ??=  賦值操作 
    
當(dāng)變量有值,使用自己的值

當(dāng)變量為null害捕,使用后面的內(nèi)容進(jìn)行賦值
    
12 級(jí)聯(lián)語(yǔ)法:

final p2 = Person()
           ..name = "why"
           ..run()
           ..eat()
           ..swim();

final p1 = Person();
p1.name = 'why’;
p1.run();
p1.eat();
p1.swim();
  
13 await

await 關(guān)鍵字必須在 async 函數(shù)內(nèi)部使用

14 設(shè)置頭像圓角

CircleAvatar
    
ClipOval

ClipRRect
    
Container + BoxDecoration + DecorationImage

15 CustomScrollView

slivers
    SliverAppBar
    SliverGrid
    SliverList

16  檢測(cè)左上角的返回操作
  
外層包裝一層WillPopScope绿淋,實(shí)現(xiàn)onWillPop方法

 返回為true: 使用系統(tǒng)提供的返回方法

返回為false:自定義返回方法
   
17 Icon 字體圖標(biāo)和圖片圖標(biāo)

字體圖標(biāo)矢量圖放大后不會(huì)失真

字體圖標(biāo)可以設(shè)置顏色

字體圖標(biāo)很多時(shí),占據(jù)空間較小

18 build方法的執(zhí)行時(shí)機(jī):

Widget build(BuildContext context)

返回界面進(jìn)行渲染的Widget

當(dāng)Widget第一次被創(chuàng)建尝盼;當(dāng)父Widget發(fā)生改變吞滞,子Widget會(huì)被重新構(gòu)建


22 抽象類

關(guān)鍵字修飾:abstract
    
抽象類不能初始化
 
抽象類中的抽象方法必須被子類實(shí)現(xiàn)
  
抽象類中已經(jīng)實(shí)現(xiàn)的方法可以不被子類重寫
    
23 常量構(gòu)造方法

const 修飾

常量構(gòu)造方法的類中,所有成員變量必須是final修飾
    
24 工廠構(gòu)造方法

 factory關(guān)鍵字修飾
    
可以手動(dòng)返回一個(gè)對(duì)象
   
25 getter盾沫、setter方法

返回值類型 get get方法名 { 方法體 }

set set方法名(參數(shù)) { 方法體 }

26 debug模式

斷言是有效的

服務(wù)擴(kuò)展是有效的

debugging是有效的

運(yùn)行:flutter run

27 release模式

斷言是無(wú)效的

服務(wù)擴(kuò)展是無(wú)效的

debugging是無(wú)效的

flutter run —release

28 StatefulWidget的生命周期:

StatefulWidget的構(gòu)造函數(shù)調(diào)用

StatefulWidget的createState調(diào)用

State的構(gòu)造函數(shù)調(diào)用

State的initState調(diào)用

State的didChangeDependencies調(diào)用

State的build調(diào)用

State的dispose調(diào)用

29 try  catch  finally

num stringConvertNum(String str) {

  num result = 0;

  try {

    result = num.parse(str);

  } on FormatException catch (e) {

    print("發(fā)生Format異常 ${e.toString()}”);

  } finally {

    print("禁止程序崩潰");
  }

  print("result = $result”);

  return result;
}

30 子類和父類構(gòu)造函數(shù)調(diào)用順序 

先調(diào)用父類的構(gòu)造方法裁赠,再調(diào)用子類的構(gòu)造方法

31 Dart 中 num 類型分為 int 和 double ,沒有float 類型赴精。

Dart 中 if 等語(yǔ)句只支持 bool 類型

32 強(qiáng)類型語(yǔ)言

Dart屬于是強(qiáng)類型語(yǔ)言佩捞,但可以用var來(lái)聲明變量,Dart會(huì)自推導(dǎo)出數(shù)據(jù)類型蕾哟。

var 實(shí)際上是編譯期的“語(yǔ)法糖”一忱。 

dynamic表示動(dòng)態(tài)類型,被編譯后實(shí)際是一個(gè)object類型谭确,在編譯期間不進(jìn)行任何的類型檢查帘营,而是在運(yùn)行期進(jìn)行類型檢查。

33 Dart中一切都是對(duì)象

在Dart中一切都是對(duì)象琼富,所有的對(duì)象都繼承自O(shè)bject仪吧。
 
Dart沒有public protected private等關(guān)鍵字,如果某個(gè)變量以下劃線(_)開頭鞠眉,代表這個(gè)變量在庫(kù)中是私有的薯鼠。

34 Dart語(yǔ)言的特性:

a:Dart的語(yǔ)法清晰明了,工具簡(jiǎn)單但功能強(qiáng)大械蹋。

b:容易上手出皇,充分吸收了高級(jí)語(yǔ)言特性

c:響應(yīng)式編程

d:執(zhí)行速度快,Dart提供提前優(yōu)化編譯哗戈,在移動(dòng)設(shè)備和Web上快速啟動(dòng)郊艘。

e:易于移植,Dart可編譯成 ARM 和 X86 代碼,這樣Dart移動(dòng)應(yīng)用程序可以在 iOS纱注、Android 和其他地方運(yùn)行畏浆。

35 WidgetsBinding.instance.addPostFrameCallback

WidgetsBinding.instance.addPostFrameCallback(_onAfterRendering);

addPostFrameCallback 是 StatefulWidget 渲染結(jié)束的回調(diào),只會(huì)被調(diào)用一次狞贱,之后 StatefulWidget 需要刷新 UI 也不會(huì)被調(diào)用刻获,

36 Dart的消息機(jī)制

Dart 在單線程中是以消息循環(huán)機(jī)制來(lái)運(yùn)行的,其中包含兩個(gè)任務(wù)隊(duì)列瞎嬉,一個(gè)是“微任務(wù)隊(duì)列” microtask queue蝎毡,另一個(gè)叫做“事件隊(duì)列” event queue。 

入口函數(shù) main() 執(zhí)行完后氧枣,消息循環(huán)機(jī)制便啟動(dòng)了沐兵。

首先會(huì)按照先進(jìn)先出的順序逐個(gè)執(zhí)行微任務(wù)隊(duì)列中的任務(wù),當(dāng)所有微任務(wù)隊(duì)列執(zhí)行完后便開始執(zhí)行事件隊(duì)列中的任務(wù)便监,事件任務(wù)執(zhí)行完畢后再去執(zhí)行微任務(wù)扎谎,如此循環(huán)往復(fù),生生不息茬贵。

37 判斷

final Brightness brightness1 = ThemeData.estimateBrightnessForColor(Colors.white);

Brightness.light

Brightness.dark

38 key

每個(gè)Widget都有唯一標(biāo)識(shí)key,

如果key作為參數(shù)傳入Widget里面簿透,則會(huì)根據(jù)指定的名字生成key

在有些場(chǎng)景下需要保存key,并且通過key訪問該Widget

可以通過GlobalKey移袍、LocalKey解藻、UniqueKey或ObjectKey進(jìn)行保存

使用場(chǎng)景:復(fù)制操作,刷新組件

39 WidgetsBinding.instance.addPostFrameCallback

addPostFrameCallback 是StatefulWidget 渲染結(jié)束的回調(diào),只會(huì)被調(diào)用一次葡盗,之后 StatefulWidget 需要刷新 UI 也不會(huì)被調(diào)用螟左。

addPostFrameCallback 的使用方法是在 initState 里添加回調(diào):

void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) => {});
}

使用這個(gè)方法就可以在判斷渲染完成,并獲取到元素的大小觅够。

40 StatefulWidget - 生命周期

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

2 initState

3 didChangeDependencies

4 build

5 addPostFrameCallback

6 (組件狀態(tài)改變)didUpdateWidget

7 deactivate

8 dispose

41 StatelessWidget - 生命周期

1 構(gòu)造函數(shù)初始化

2 提供build渲染

build 是用來(lái)創(chuàng)建 Widget 的胶背,但因?yàn)?build 在每次界面刷新的時(shí)候都會(huì)調(diào)用,

所以不要在 build 里寫業(yè)務(wù)邏輯喘先,可以把業(yè)務(wù)邏輯寫到你的 StatelessWidget 的構(gòu)造函數(shù)里钳吟。

無(wú)狀態(tài)的Widget

無(wú)法提供setState修改組件的狀態(tài)

內(nèi)部屬性應(yīng)聲明為final,防止意外發(fā)生改變

42 App的生命周期

didChangeAppLifecycleState App生命周期發(fā)生變化

  切換后臺(tái):

  AppLifecycleState.inactive -> AppLifecycleState.paused
  
  @override
  void didChangeAppLifecycleState(AppLifecycleState state){
    super.didChangeAppLifecycleState(state);
    // app退到后臺(tái)
    if (state == AppLifecycleState.paused) {
    }
  }

  切換前臺(tái):

  AppLifecycleState.inactive -> AppLifecycleState.resumed

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    // app回到前臺(tái)
    if (state == AppLifecycleState.resumed) {
    }
  }

43 組件移除

頁(yè)面銷毀的時(shí)候會(huì)依次執(zhí)行:

deactivate : State對(duì)象從樹中被移除時(shí)

dispose: State對(duì)象從樹中被永久移除時(shí)調(diào)用窘拯;通常在此回調(diào)中釋放資源

44 GestureDetector處理手勢(shì)操作

HitTestBehavior.opaque 自己處理事件

 HitTestBehavior.deferToChild child處理事件


HitTestBehavior.translucent 自己和child都可以接收事件

45 時(shí)間戳獲取

final int timestamp = DateTime.now().millisecondsSinceEpoch;

46 捕獲Flutter framework異常

FlutterError.onError = (FlutterErrorDetails details) {

  LogPrint.d("捕獲Flutter framework異常 ${details.exception}");

  Zone.current.handleUncaughtError(details.exception, details.stack!);
};

47 Flutter創(chuàng)建module

flutter create -t module flutter_module

48 widget 樹的 root 節(jié)點(diǎn)

runApp()方法中的 Widget红且。

49 編譯模式

Flutter 的 Debug 下是 JIT 模式,release 下是 AOT 模式涤姊。

50 AutomaticKeepAliveClientMixin

Flutter 中可以通過 mixin AutomaticKeepAliveClientMixin 暇番,

然后重寫 wantKeepAlive 保持住頁(yè)面,build 中調(diào)用super.build 思喊。

51 如何實(shí)現(xiàn)點(diǎn)擊空白區(qū)域收起鍵盤壁酬?

FocusScope.of(context).requestFocus(FocusNode());

52 如何統(tǒng)一管理錯(cuò)誤頁(yè)面?

// 自定義錯(cuò)誤頁(yè)面
ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
  return const Text("data");
};

53 Dart 屬于是強(qiáng)類型語(yǔ)言

Dart 屬于是強(qiáng)類型語(yǔ)言 ,但可以用 var 來(lái)聲明變量舆乔,

Dart 會(huì)自推導(dǎo)出數(shù)據(jù)類型岳服,var 實(shí)際上是編譯期的“語(yǔ)法糖”。

dynamic 表示動(dòng)態(tài)類型希俩,被編譯后派阱,實(shí)際是一個(gè) object 類型,

在編譯期間不進(jìn)行任何的類型檢查斜纪,而是在運(yùn)行期進(jìn)行類型檢查贫母。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盒刚,隨后出現(xiàn)的幾起案子腺劣,更是在濱河造成了極大的恐慌,老刑警劉巖因块,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘原,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涡上,警方通過查閱死者的電腦和手機(jī)趾断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吩愧,“玉大人芋酌,你說我怎么就攤上這事⊙慵眩” “怎么了脐帝?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)糖权。 經(jīng)常有香客問我堵腹,道長(zhǎng),這世上最難降的妖魔是什么星澳? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任疚顷,我火速辦了婚禮,結(jié)果婚禮上禁偎,老公的妹妹穿的比我還像新娘腿堤。我一直安慰自己,他們只是感情好届垫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布释液。 她就那樣靜靜地躺著,像睡著了一般装处。 火紅的嫁衣襯著肌膚如雪误债。 梳的紋絲不亂的頭發(fā)上浸船,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音寝蹈,去河邊找鬼李命。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箫老,可吹牛的內(nèi)容都是我干的封字。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼耍鬓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阔籽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起牲蜀,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笆制,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后涣达,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在辆,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年度苔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匆篓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寇窑,死狀恐怖鸦概,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疗认,我是刑警寧澤完残,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站横漏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熟掂。R本人自食惡果不足惜缎浇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赴肚。 院中可真熱鬧素跺,春花似錦、人聲如沸誉券。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)踊跟。三九已至踩验,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箕憾。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工牡借, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袭异。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓钠龙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親御铃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碴里,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容