美文网首页flutter相关
Flutter知识积累

Flutter知识积累

作者: Jean_Lina | 来源:发表于2022-05-11 10:08 被阅读0次
    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<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:赋值的内容必须在编译时已经确定
    
    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<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:赋值的内容必须在编译时已经确定
    
    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知识积累

        本文链接:https://www.haomeiwen.com/subject/merdurtx.html