在Android中,addChild和removeChild动态添加或删除View。 在Flutter中,因为widget是不可变的,所以没有addChild。可以传入一个函数,该函数返回一个widget给父项,并通过布尔值控制该widget的创建。【转变开发思维】
在Android中,通常在继承View的基础上去自定义View。在Flutter中,一个自定义widget通常是通过组合其它widget来实现的,而不是继承。
在Android中,Intent。在Flutter中,Router 和 Navigator。
Navigator.of(context).pushNamed('/b');
在Android中,在AndroidManifest.xml中声明Activities,在Flutter中,将具有指定Route的Map传递到顶层MaterialApp实例。
startActivityForResult,在Flutter中通过等待push返回的Future来完成。
// 等待上一个页面返回数据
Map coordinates = await Navigator.of(context).pushNamed('/location');
// 回到上一级页面,并携带数据
Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});
Dart是单线程执行模型,支持Isolates(在另一个线程上运行Dart代码的方式)、事件循环和异步编程。 除非您启动一个Isolate,否则您的Dart代码将在主UI线程中运行,并由事件循环驱动(和JavaScript一样)
Flutter中的异步:使用async + await,使用setState更新UI,这会触发build方法再次运行并更新数据。【flutter中异步是针对一个函数而言】
Isolates ???
网络请求
// 再调用数据bean封装
loadData() async {
String dataURL = "https://jsonplaceholder.typicode.com/posts";
http.Response response = await http.get(dataURL);
setState(() {
widgets = JSON.decode(response.body);
});
}
- 分辨率icon的处理
Flutter遵循像iOS这样简单的3种分辨率格式: 1x, 2x, and 3x。创建一个名为images的文件夹,并为每个图像文件生成一个@2x和@3x文件,如下:
…/my_icon.png
…/2.0x/my_icon.png
…/3.0x/my_icon.png
需要在asset中声明:
assets:
- images/a_dot_burr.jpeg
- images/a_dot_ham.jpeg
使用图片:return new AssetImage("images/a_dot_burr.jpeg");
生命周期 WidgetsBindingObserver
LinearLayout 等价于 Row 和 Column
RelativeLayout 可以使用 Column、Row和Stack组合实现
-Flutter中滑动控件全部使用ListView
Flutter点击事件:两种方法
1、Widget支持事件监听,直接设置onPressed: () { }
2、Widget不支持事件监听,包装到GestureDetector中,再设置onTap: () { }
GestureDetector还可以设置onTapUp、onTapDown、双击、长按、水平|垂直拖拽Android中的Adapter,Flutter中只需要简单的构件List<Widget>,传给ListView: children即可,Flutter将负责确保它们快速平滑地滚动。Flutter如何给每个item添加点击事件呢?就是给每个item添加GestureDetector监听。Adapter类似于itemBuilder