Views
- Flutter中,Widget代替安卓的view的概念,并且任何东西都Widget。区别在于,Widget仅仅支持一帧,每一帧都会创建Widget实例树,相当于一次性绘制整个界面。Android中的View,在绘制结束之后不会重绘,除非使用invalidate方法
- Flutter中的Widget分为有状态的(StatefulWidget)和无状态的(StatelessWidgets),更新一个Widget需要使用新建一个StatefulWidget和一个State对象配合使用
- 布局方式只能通过布局树实现,不能像安卓样使用xml进行布局
- Widget是不可变的,没有addChild等方法,所以可以通过一个方法动态返回不同的Widget实现布局中的添加或者删除组件的功能
- Flutter中可以通过AnimationController和Animation(例如:CurvedAnimation)实现动画
- 可以通过CustomPaint和CustomPainter替代安卓中的Canvas实现在屏幕上绘制自定义形状
- 可以通过Widget的组合完成自定义控件(在安卓中是通过继承View)
Intents
- Flutter中不存在Intents的概念,与Native的整合中需要用到Intents,另外就是调用外部组件,如Camera或者File picker。Native可以通过MethodChannel与Flutter完成数据通信
- Flutter中,管理多个屏幕有两个核心概念和类:Route 和 Navigator。Route是应用程序的“屏幕”或“页面”的抽象(可以认为是Activity), Navigator是管理Route的Widget。Navigator可以通过push和pop route以实现页面切换
- 处理Flutter中所有路由的Navigator类可用于从已经push到栈的路由中获取结果(实现安卓中的startActivityForResult)
异步UI
- Dart是单线程执行模型,除非启动一个Isolate(在另外一个线程上运行Dart代码的方式),否则Dart代码将在UI线程中执行,并由事件循环驱动
- Flutter是单线程的,运行一个事件循环,所以无法进行线程管理或者使用像安卓中AsyncTasks、IntentServices的功能。方法后面增加asyn标识,既可以使此方法异步执行(可以进行耗时操作,如网络请求)
loadData() async {
String dataURL = "https://jsonplaceholder.typicode.com/posts";
http.Response response = await http.get(dataURL);
setState(() {
widgets = JSON.decode(response.body);
});
}
- 可以通过Isolates执行耗时或计算密集型任务。是一个独立的线程,不能与主线程共享内存
- 网络请求可以使用http包
- 通过Progress Indicator widget实现进度指示器
项目结构
- Flutter遵循像iOS这样简单的3种分辨率格式: 1x, 2x, and 3x(资源文件放到images中并且需要在pubspec.yaml中进行声明)
- 字符串的存储的最好方式是新建一个Strings类,并且在里面存放static类型的string,然后通过Strings类引用字符
- Flutter中通过pubspec.yaml来管理依赖(Android中是gradle)
Activities和Fragments
- 在Flutter中Activity和Fragment都对应Widget的概念
- Flutter中可以通过挂接到WidgetsBinding观察并监听didChangeAppLifecycleState更改事件来监听生命周期事件
生命周期事件是:
resumed - 应用程序可见并响应用户输入。这是来自Android的onResume
inactive - 应用程序处于非活动状态,并且未接收用户输入。此事件在Android上未使用,仅适用于iOS
paused - 应用程序当前对用户不可见,不响应用户输入,并在后台运行。这是来自Android的暂停
suspending - 该应用程序将暂时中止。这在iOS上未使用
Layouts
- Flutter中可以通过Row和Column实现LinearLayout
- 通过使用Column、Row和Stack的组合来实现RelativeLayout的效果
- Flutter中Listview对应安卓中ScrollView、Listview。Flutter实现notifyDataSetChanged需要在setState中创建一个新的List(),并且将所有旧数据复制到新列表中
- ListView.Builder相当于安卓中的RecyclerView
- Text widget上设置自定义字体,需要将字体文件夹放到assets文件夹中,然后在pubspec.yaml中声名
- Text的样式有一个对应TextStyle对象,可以在其中自定义许多参数
color
decoration
decorationColor
decorationStyle
fontFamily
fontSize
fontStyle
fontWeight
hashCode
height
inherit
letterSpacing
textBaseline
wordSpacing
- 可以通过向Text Widget的装饰构造函数参数添加InputDecoration对象,完成输入框显示占位符文本。同样设置InputDecoration的errorText可以显示验证错误
手势检测和触摸事件处理
- Flutter中可以通过Widget的onPressed事件完成点击事件的回调(setOnClickListener)
- 如果Widget不支持事件监听,可以将改Widget包装到GestureDetector中,并处理onTap方法
- GestureDetector支持的收拾
Tap:onTapDown、onTapUp、onTap、onTapCancel
Double tap:onDoubleTap
长按:onLongPress
垂直拖动:onVerticalDragStart、onVerticalDragUpdate、onVerticalDragEnd
水平拖拽:onHorizontalDragStart、onHorizontalDragUpdate、onHorizontalDragEnd
数据库与本地存储
- 可以通过插件Shared_Preferences来完成对Shared Preferences的操作
- 在Flutter中,您可以使用SQFlite插件来访问SQFlite此功能
参考:
https://flutterchina.club/flutter-for-android/ |