特性 | Android | Flutter |
UI视图 | View,视图更新只需要修改View的内容来更新部分内容, 视图页面Activity, Fragment | Widget,视图更新需要通过setState()重建整个widget |
UI布局 | Xml来编写布局,主要布局和逻辑分开,在不同文件中 | Widget树来编写布局, 布局逻辑不分开,在同一文件内 |
ViewChild | 通过addChild,removeChild动态添加删除view | 没有add,remove功能,只能通过bool数值来控制widget是否添加 |
Animate | Android中使用View.animate()对视图进行动画处理 | 使用AnimationController和Interpolator |
自定义形状 | Canvas | 使用CustomPaint和CustomPainter绘制画布 |
自定义view | 继承View或者已存在的某个控件自定义View | 一个自定义的Widget通常是通过组合其他widget来实现的,不是继承 |
页面切换 | 通过intent,startActivity | 通过Route, Navigator,push,pop page |
UITthread, 耗时、异步操作 | Main UI Thread,Thread, Handler | async, await, Main isolate, Backgroud Isolate, IsolateNameServer
|
Image资源文件 | mdpi,hdpi,xhpi,xxhdpi等目录下,编译后生成gen索引目录,并通过R.drawable.xxx访问 | 创建一个名为images的文件夹,并为每个图像文件生成一个@2x和@3
x文件,需要在pubspec.yaml文件中声明这些图片 |
编译依赖 | Gradle里添加依赖 | pubspec.yaml声明用于外部依赖 |
生命周期 | 通过复写Activity的方法来捕获Activity的生命周期 | 通过挂接WidgetsBinding观察并监听didChangeAppLifecycleState更改事件来监听生命周期事件(resumed、inactive、paused、suspending) |
按键监听 | 调用setOnClickListener将onClick绑定到View上 | 通过包装 RawKeyboardListener,GestureDetector来检测按键 |
本地存储 | SharedPreferences存储键值对 | 通过插件Shared_Prefrences来访问此功能 |
数据库存储 | SQLite存储 | 使用SQFlite插件访问SQFlite功能 |
开发过程热重载 | 无此功能 | Debug 模式有此功能,不用重新编译,文件保存完reload一下即可 |
热加载 | 无此功能 | 通过实现 getFlutterShellArgs 热加载修改过的libapp.so文件, |