Flutter知识积累

1 mounted:判断页面是否被释放,如果释放了就不进行渲染

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


2 GlobalKey的使用:

final GlobalKey<_UserInfoItemState> _globalKey = GlobalKey();

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

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

3 安卓设备启动图片的大小

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

如果assert 的判断为true, 则继续执行下面的语句。反之抛出一个异常。

5 计算Text内容高度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 计算item内容高度

  void calculateContentHeight() {
    Future.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:赋值的内容必须在编译时已经确定

final:赋值时,可以动态获取,赋值的内容在运行时已经确定

8 dynamic和Object

dynamic调用方法时,编译不会报错,运行时存在安全隐患

Object类型,调用方法时,编译会报错

9 Dart语法:

Dart是单线程的

 Dart中的函数不支持方法重载

10
设置高斯模糊 ImageFiltered

 SizeBox 设置水平方向、垂直方向的间距

用三个单引号表示多行字符串 '''         ‘’'

集合类型Set:元素无序,不重复


11 ??=  赋值操作 
    
当变量有值,使用自己的值

当变量为null,使用后面的内容进行赋值
    
12 级联语法:

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

final p1 = Person();
p1.name = 'why’;
p1.run();
p1.eat();
p1.swim();
  
13 await
await 关键字必须在 async 函数内部使用

14 设置头像圆角

CircleAvatar
    
ClipOval

ClipRRect
    
Container + BoxDecoration + DecorationImage

15 CustomScrollView

slivers
    SliverAppBar
    SliverGrid
    SliverList

16  检测左上角的返回操作
  
外层包装一层WillPopScope,实现onWillPop方法

 返回为true: 使用系统提供的返回方法

返回为false:自定义返回方法
   
17 Icon 字体图标和图片图标

字体图标矢量图放大后不会失真

字体图标可以设置颜色

字体图标很多时,占据空间较小

18 build方法的执行时机:

Widget build(BuildContext context)

返回界面进行渲染的Widget

当Widget第一次被创建;当父Widget发生改变,子Widget会被重新构建

19 mixin混入

 mixin 关键字定义一个类,其他类通过with关键字进行混入。

with 非必须实现方法,可以不实现mixin类中已经实现的方法

Dart为了支持多重继承,引入了mixin关键字,mixin就相当于将其他类的能力混入到当前类,唯一的限制就是mixin类无法拥有构造函数。这样可以避免混入多个类时,父类构造方法的调用冲突。
 
20 隐式接口

 implements实现多个抽象类、普通类

implements 必须实现方法
    
可实现抽象类,普通类(多实现,实现多个类、抽象类)
    
一个类通过implements实现多个抽象类,必须实现抽象类的所有方法(未实现和已实现的方法)
   
21 extends

继承,可继承抽象类、普通类(单继承,只能继承一个类)
    
22 抽象类

关键字修饰:abstract
    
抽象类不能初始化
 
抽象类中的抽象方法必须被子类实现
  
抽象类中已经实现的方法可以不被子类重写
    
23 常量构造方法

const 修饰

常量构造方法的类中,所有成员变量必须是final修饰
    
24 工厂构造方法

 factory关键字修饰
    
可以手动返回一个对象
   
25 getter、setter方法

返回值类型 get get方法名 { 方法体 }

set set方法名(参数) { 方法体 }

26 debug模式

断言是有效的

服务扩展是有效的

debugging是有效的

flutter run运行

27 release模式

断言是无效的

服务扩展是无效的

debugging是无效的

flutter run —release

28 StatefulWidget的生命周期:

StatefulWidget的构造函数调用

StatefulWidget的createState调用

State的构造函数调用

State的initState调用

State的didChangeDependencies调用

State的build调用

State的dispose调用

29 try  catch  finally

num stringConvertNum(String str) {

  num result = 0;

  try {

    result = num.parse(str);

  } on FormatException catch (e) {

    print("发生Format异常 ${e.toString()}”);

  } finally {

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

  print("result = $result”);

  return result;
}

30 子类和父类构造函数调用顺序 

先调用父类的构造方法,再调用子类的构造方法

31 Dart 中 num 类型分为 int 和 double ,没有float 类型。

Dart 中 if 等语句只支持 bool 类型

32 强类型语言

Dart属于是强类型语言,但可以用var来声明变量,Dart会自推导出数据类型。

var 实际上是编译期的“语法糖”。 

dynamic表示动态类型,被编译后实际是一个object类型,在编译期间不进行任何的类型检查,而是在运行期进行类型检查。

33 Dart中一切都是对象

在Dart中一切都是对象,所有的对象都继承自Object。

Dart是强类型语言,但可以用var或dynamic来声明一个变量,Dart会自动推断其数据类型。
 
Dart没有public protected private等关键字,如果某个变量以下划线(_)开头,代表这个变量在库中是私有的。

34 Dart语言的特性:

a:Dart的语法清晰明了,工具简单但功能强大。

b:容易上手,充分吸收了高级语言特性

c:响应式编程

d:执行速度快,Dart提供提前优化编译,在移动设备和Web上快速启动。

e:易于移植,Dart可编译成 ARM 和 X86 代码,这样Dart移动应用程序可以在 iOS、Android 和其他地方运行。

35 WidgetsBinding.instance.addPostFrameCallback

WidgetsBinding.instance.addPostFrameCallback(_onAfterRendering);

addPostFrameCallback 是 StatefulWidget 渲染结束的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用,

36 Dart的消息机制

Dart 在单线程中是以消息循环机制来运行的,其中包含两个任务队列,一个是“微任务队列” microtask queue,另一个叫做“事件队列” event queue。 

入口函数 main() 执行完后,消息循环机制便启动了。

首先会按照先进先出的顺序逐个执行微任务队列中的任务,当所有微任务队列执行完后便开始执行事件队列中的任务,事件任务执行完毕后再去执行微任务,如此循环往复,生生不息。

37 判断

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

Brightness.light

Brightness.dark

38 key

每个Widget都有唯一标识key,

如果key作为参数传入Widget里面,则会根据指定的名字生成key

在有些场景下需要保存key,并且通过key访问该Widget

可以通过GlobalKey、LocalKey、UniqueKey或ObjectKey进行保存

使用场景:复制操作,刷新组件

39 WidgetsBinding.instance.addPostFrameCallback

addPostFrameCallback 是StatefulWidget 渲染结束的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用。

addPostFrameCallback 的使用方法是在 initState 里添加回调:

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

使用这个方法就可以在判断渲染完成,并获取到元素的大小。

40 StatefulWidget - 生命周期

1 构造函数

2 initState

3 didChangeDependencies

4 build

5 addPostFrameCallback

6 (组件状态改变)didUpdateWidget

7 deactivate

8 dispose

showModalBottomSheet系统弹框

41 StatelessWidget - 生命周期

1 构造函数初始化

2 提供build渲染

build 是用来创建 Widget 的,但因为 build 在每次界面刷新的时候都会调用,

所以不要在 build 里写业务逻辑,可以把业务逻辑写到你的 StatelessWidget 的构造函数里。


无状态的Widget

无法提供setState修改组件的状态

内部属性应声明为final,防止意外发生改变

42 App的生命周期

didChangeAppLifecycleState App生命周期发生变化

  切换后台:

  AppLifecycleState.inactive -> AppLifecycleState.paused
  
  @override
  void didChangeAppLifecycleState(AppLifecycleState state){
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
      // app退到后台后, 刷新状态
    }
  }

  切换前台:

  AppLifecycleState.inactive -> AppLifecycleState.resumed -> build

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    // app显示后, 刷新状态
    if (state == AppLifecycleState.resumed) {
      // 刷新代码
    }
  }

43 组件移除

页面销毁的时候会依次执行:

deactivate : State对象从树中被移除时

dispose: State对象从树中被永久移除时调用;通常在此回调中释放资源

44 GestureDetector处理手势操作

HitTestBehavior.opaque 自己处理事件

 HitTestBehavior.deferToChild child处理事件


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

45 时间戳获取

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出现冲突的修改:
1 mounted:判断页面是否被释放,如果释放了就不进行渲染

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


2 GlobalKey的使用:

final GlobalKey<_UserInfoItemState> _globalKey = GlobalKey();

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

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

3 安卓设备启动图片的大小

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

如果assert 的判断为true, 则继续执行下面的语句。反之抛出一个异常。

5 计算Text内容高度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 计算item内容高度

  void calculateContentHeight() {
    Future.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:赋值的内容必须在编译时已经确定

final:赋值时,可以动态获取,赋值的内容在运行时已经确定

8 dynamic和Object

dynamic调用方法时,编译不会报错,运行时存在安全隐患

Object类型,调用方法时,编译会报错

9 Dart语法:

Dart是单线程的

 Dart中的函数不支持方法重载

设置高斯模糊 ImageFiltered


 SizeBox 设置水平方向、垂直方向的间距


用三个单引号表示多行字符串 '''         ‘’'




10 Set

集合类型Set:元素无序,不重复

11 ??=  赋值操作 
    
当变量有值,使用自己的值

当变量为null,使用后面的内容进行赋值
    
12 级联语法:

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

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

await 关键字必须在 async 函数内部使用

14 设置头像圆角

CircleAvatar
    
ClipOval

ClipRRect
    
Container + BoxDecoration + DecorationImage

15 CustomScrollView

slivers
    SliverAppBar
    SliverGrid
    SliverList

16  检测左上角的返回操作
  
外层包装一层WillPopScope,实现onWillPop方法

 返回为true: 使用系统提供的返回方法

返回为false:自定义返回方法
   
17 Icon 字体图标和图片图标

字体图标矢量图放大后不会失真

字体图标可以设置颜色

字体图标很多时,占据空间较小

18 build方法的执行时机:

Widget build(BuildContext context)

返回界面进行渲染的Widget

当Widget第一次被创建;当父Widget发生改变,子Widget会被重新构建


22 抽象类

关键字修饰:abstract
    
抽象类不能初始化
 
抽象类中的抽象方法必须被子类实现
  
抽象类中已经实现的方法可以不被子类重写
    
23 常量构造方法

const 修饰

常量构造方法的类中,所有成员变量必须是final修饰
    
24 工厂构造方法

 factory关键字修饰
    
可以手动返回一个对象
   
25 getter、setter方法

返回值类型 get get方法名 { 方法体 }

set set方法名(参数) { 方法体 }

26 debug模式

断言是有效的

服务扩展是有效的

debugging是有效的

运行:flutter run

27 release模式

断言是无效的

服务扩展是无效的

debugging是无效的

flutter run —release

28 StatefulWidget的生命周期:

StatefulWidget的构造函数调用

StatefulWidget的createState调用

State的构造函数调用

State的initState调用

State的didChangeDependencies调用

State的build调用

State的dispose调用

29 try  catch  finally

num stringConvertNum(String str) {

  num result = 0;

  try {

    result = num.parse(str);

  } on FormatException catch (e) {

    print("发生Format异常 ${e.toString()}”);

  } finally {

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

  print("result = $result”);

  return result;
}

30 子类和父类构造函数调用顺序 

先调用父类的构造方法,再调用子类的构造方法

31 Dart 中 num 类型分为 int 和 double ,没有float 类型。

Dart 中 if 等语句只支持 bool 类型

32 强类型语言

Dart属于是强类型语言,但可以用var来声明变量,Dart会自推导出数据类型。

var 实际上是编译期的“语法糖”。 

dynamic表示动态类型,被编译后实际是一个object类型,在编译期间不进行任何的类型检查,而是在运行期进行类型检查。

33 Dart中一切都是对象

在Dart中一切都是对象,所有的对象都继承自Object。
 
Dart没有public protected private等关键字,如果某个变量以下划线(_)开头,代表这个变量在库中是私有的。

34 Dart语言的特性:

a:Dart的语法清晰明了,工具简单但功能强大。

b:容易上手,充分吸收了高级语言特性

c:响应式编程

d:执行速度快,Dart提供提前优化编译,在移动设备和Web上快速启动。

e:易于移植,Dart可编译成 ARM 和 X86 代码,这样Dart移动应用程序可以在 iOS、Android 和其他地方运行。

35 WidgetsBinding.instance.addPostFrameCallback

WidgetsBinding.instance.addPostFrameCallback(_onAfterRendering);

addPostFrameCallback 是 StatefulWidget 渲染结束的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用,

36 Dart的消息机制

Dart 在单线程中是以消息循环机制来运行的,其中包含两个任务队列,一个是“微任务队列” microtask queue,另一个叫做“事件队列” event queue。 

入口函数 main() 执行完后,消息循环机制便启动了。

首先会按照先进先出的顺序逐个执行微任务队列中的任务,当所有微任务队列执行完后便开始执行事件队列中的任务,事件任务执行完毕后再去执行微任务,如此循环往复,生生不息。

37 判断

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

Brightness.light

Brightness.dark

38 key

每个Widget都有唯一标识key,

如果key作为参数传入Widget里面,则会根据指定的名字生成key

在有些场景下需要保存key,并且通过key访问该Widget

可以通过GlobalKey、LocalKey、UniqueKey或ObjectKey进行保存

使用场景:复制操作,刷新组件

39 WidgetsBinding.instance.addPostFrameCallback

addPostFrameCallback 是StatefulWidget 渲染结束的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用。

addPostFrameCallback 的使用方法是在 initState 里添加回调:

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

使用这个方法就可以在判断渲染完成,并获取到元素的大小。

40 StatefulWidget - 生命周期

1 构造函数

2 initState

3 didChangeDependencies

4 build

5 addPostFrameCallback

6 (组件状态改变)didUpdateWidget

7 deactivate

8 dispose

41 StatelessWidget - 生命周期

1 构造函数初始化

2 提供build渲染

build 是用来创建 Widget 的,但因为 build 在每次界面刷新的时候都会调用,

所以不要在 build 里写业务逻辑,可以把业务逻辑写到你的 StatelessWidget 的构造函数里。

无状态的Widget

无法提供setState修改组件的状态

内部属性应声明为final,防止意外发生改变

42 App的生命周期

didChangeAppLifecycleState App生命周期发生变化

  切换后台:

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

  切换前台:

  AppLifecycleState.inactive -> AppLifecycleState.resumed

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

43 组件移除

页面销毁的时候会依次执行:

deactivate : State对象从树中被移除时

dispose: State对象从树中被永久移除时调用;通常在此回调中释放资源

44 GestureDetector处理手势操作

HitTestBehavior.opaque 自己处理事件

 HitTestBehavior.deferToChild child处理事件


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

45 时间戳获取

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创建module

flutter create -t module flutter_module

48 widget 树的 root 节点

runApp()方法中的 Widget。

49 编译模式

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

50 AutomaticKeepAliveClientMixin

Flutter 中可以通过 mixin AutomaticKeepAliveClientMixin ,

然后重写 wantKeepAlive 保持住页面,build 中调用super.build 。

51 如何实现点击空白区域收起键盘?

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

52 如何统一管理错误页面?

// 自定义错误页面
ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
  return const Text("data");
};

53 Dart 属于是强类型语言

Dart 属于是强类型语言 ,但可以用 var 来声明变量,

Dart 会自推导出数据类型,var 实际上是编译期的“语法糖”。

dynamic 表示动态类型,被编译后,实际是一个 object 类型,

在编译期间不进行任何的类型检查,而是在运行期进行类型检查。

你可能感兴趣的:(Flutter知识积累)