当前位置:网站首页>Flutter经验整理

Flutter经验整理

2022-08-11 11:25:00 雨沐Andy

flutter经验总结,稍候会整理进简历

    1:使用flutter_screenutil做跨平台适配时,ios页面个别细节需要微调整
    2: 再IOS平台上底部弹窗需要使用SafeArea包裹,避免出现弹窗底部按钮和导航栏遮挡
    3:优先考虑使用update['id']这种方式局部刷新页面
    4:主题的更换,使用一个类来实现,主要涉及颜色、图片等资源,避免到处传参
    5:发挥flutter跨平台的最大特性,个别特殊功能使用PlatformView或者Channel和原生交互实现
    6:
    
 flutter异常捕获(最终还是通过原生上报)

         1:原生接入友盟统计 2:在flutter和原生进行channle交互配置 3:在flutter中通过FlutterError.onError,提供⼀个⾃定义的错误处理回调 4:最终还是通过原生上报

MobclickAgent.reportError

//全局异常的捕捉
class AppCatchError {
  run(Widget app) {
    ///Flutter 框架异常
    FlutterError.onError = (FlutterErrorDetails details) async {
      ///线上环境
      if (BaseUrl.DEBUG == false) {
        Zone.current.handleUncaughtError(details.exception, details.stack!);
      } else {
        //开发期间 print
        FlutterError.dumpErrorToConsole(details);
      }
    };

    runZonedGuarded(() {
      //受保护的代码块
      runApp(app);
    }, (error, stack) => catchError(error, stack));
  }

  ///对搜集的 异常进行处理  上报等等
  catchError(Object error, StackTrace stack) {
    // print("AppCatchError>>>>>>>>>>: $kReleaseMode"); //是否是 Release版本
    // print('AppCatchError message:$error,stack$stack');

    if (BaseUrl.DEBUG == true) {
      // if (kDebugMode) {
      // ignore: avoid_print
      print(
          '\n\n\n\n全局异常捕获\n\n\nerror:$error\n:$stack\n\n\n\n');
      // }
    }

    CrashTool.crashGlobalWithType(
        content: stack.toString(), error: error.toString());
  }
}

    

介绍Dart语言特性
在Dart中,一切都是对象,所有的对象都是继承自Object

Dart是强类型语言,但可以用var或 dynamic来声明一个变量,Dart会自动推断其数据类型,dynamic类似c#

没有赋初值的变量都会有默认值null

Dart支持顶层方法,如main方法,可以在方法内部创建方法

Dart支持顶层变量,也支持类变量或对象变量

Dart没有public protected private等关键字,如果某个变量以下划线(_)开头,代表这个变量在库中是私有的


介绍flutter
1:路由管理Navigator、Get

Dart线程模型及异常捕获
JavaOC中,如果程序发⽣异常且没有被捕获,那么程序将会终⽌,但在DartJavaScript中则不会,究其原因,这 和它们的运⾏机制有关系,JavaOC都是多线程模型的编程语⾔,任意⼀个线程触发异常且没被捕获时,整个进程就 退出了。但DartJavaScript不同,它们都是单线程模型,运⾏机制很相似(但有区别)Dart 在单线程中是以消息循环机制来运⾏的,其中包含两个任务队列,⼀个是“微任务队列” microtask queue,另⼀个 叫做“事件队列” event queue。微任务队列的执⾏优先级⾼于事件队列。函数 main() 执⾏完后,消息循环机制便启动了。⾸先会
按照先进先出的顺序逐个执⾏微任务队列中的任务,当所有微任务队列执⾏完后便开始执⾏事件队列中的任务,事件任 务执⾏完毕后再去执⾏微任务,如此循环往复,⽣⽣不息。
Dart中,所有的外部事件任务都在事件队列中,如IO、计时器、点击、以及绘制事件等,⽽微任务通常来源于Dart内 部,并且微任务⾮常少,之所以如此,是因为微任务队列优先级⾼,如果微任务太多,执⾏时间总和就越久,事件队列 任务的延迟也就越久,对于GUI应⽤来说最直观的表现就是⽐较卡,所以必须得保证微任务队列不会太⻓。值得注意的 是,我们可以通过 Future.microtask(…) ⽅法向微任务队列插⼊⼀个任务。 在事件循环中,当某个任务发⽣异常并没有被捕获时,程序并不会退出,⽽直接导致的结果是当前任务的后续代码就不 会被执⾏了,也就是说⼀个任务中的异常是不会影响其它任务执⾏的
Pointer事件处理
      
当指针按下时,Flutter会对应⽤程序执⾏命中测试(Hit Test),以确定指针与屏幕接触的位置存在哪些widget, 指针按下
事件(以及该指针的后续事件)然后被分发到由命中测试发现的最内部的widget,然后从那⾥开始,事件会在widget
中向上冒泡,这些事件会从最内部的widget被分发到到widget根的路径上的所有Widget,这和Web开发中浏览器的事件
冒泡机制相似, 但是Flutter中没有机制取消或停⽌冒泡过程,⽽浏览器的冒泡是可以停⽌的。注意,只有通过命中测试
Widget才能触发事件。
⾃定义Widget⽅法简介
       Flutter中⾃定义Widget有三种⽅式:通过组合其它Widget、通过CustomPaintCanvas⾃绘、实现RenderObject。
       
原网站

版权声明
本文为[雨沐Andy]所创,转载请带上原文链接,感谢
https://blog.csdn.net/fuweng886/article/details/126031749