RN->底层沿用原生 js
iOS和安卓实现有差别
Flutter google >有自己渲染引擎,安卓、iOS一致性 2018年
终端创建flutter项目时首字母不能大写,否则报错"Flutter_demo_" is not a valid Dart package name.
真机运行项目需要再Xcode中配置证书
AndroidStdiou运行时,项目路径有中文时会报错
强制关闭Androidstudios后打开AndroidStudios时会加载上次关闭时的缓存,如果找不到缓存会报错。此时删除flutter文件中的bin/cache/lockfile后可以解决
===========================================
语法是声明式UI,参数中传递值,不像IOS创建对象,再配置对象的属性
===========================================
命名规则
文件名:小写字母和_
类名:大写开头驼峰命名规则
属性名、方法名:小写 开头驼峰命名规则
内部类名、属性名前添加_
const 全局变量
===========================================
Widget(部件)对应于UIView
分为:状态Stateful(也为无状态,但多一个状态类,保留,渲染时也是无状态)
无状态Stateless(不可变)
===========================================
部件类要渲染需要build()方法
===========================================
Dart中的语法,方法中只有一行代码时,可以使用=>代替花括号一行表示
===========================================
===========================================
===========================================
效果如下:
===========================================
快捷键 Option Command Shift Control
Command+Shift+🔼移动代码块向上
Option+Shift+🔼移动代码行向上
Option+Command+L格式化代码
Command+[ 返回上次编辑位置
Command+] 前往下次编辑位置
Command+\热重载
Control+D开始调试项目
Control+R开始运行项目
Command+-折叠光标所在代码块
Shift+Command+-折叠文件所有代码块
Option+Enter 有错误时修复报错问题;无错误时快速将widget添加到新的widget中
Shift+Enter 开始新的输入行
===========================================
Flutter布局
Container
-alignment:Alignment(0.0,0.0),:设置该属性后,container不再跟随child子部件的尺寸变化,而是跟随父控件尺寸大小,Alignment(a,b)表示child在Container中中心点的位置,(0,0)表示child居中,(1,0)表示child与Container右对齐,(0,1)表示child与Container下对齐
padding 内边距
margin: EdgeInsets.only(left: 10, right: 10),外边距
alignment: Alignment.centerLeft,内部子部件的对齐方式
Container尺寸由子部件决定或者通过设置size决定
AspectRation
Container的width设置为20;child设置AspectRation部件,AspectRation设置aspectRadio:2/1,则Container的高度计算为100
===========================================
布局三个主要组件Row、Column、Stack
Row(children横向布局)
主轴mainAxisAlignment:MainAxisAlignment(左右)
交叉轴crossAxisAlignment:CrossAxisAlignment(上下)
当交叉轴设置.baseline时,对文本有效,需要同时设置下面属性
textBaseline:TextBaseline.alphabetic
效果如下**:**
Column(children纵向布局)
Stack(children层级布局)
Positioned组件,可以设置其child的位置,left,right,top,bottom
Expanded(填充布局,主轴方向不会剩下间隙,设置child的主轴上的尺寸无效)
===========================================
StatefulWidget
描述外观StatefulWidget
Statecreate () {
//关联State
return _SMDState;
}
需要State管理状态,build交给State实现
class _SMDState extends State {
// 调用setState((){})重新刷新渲染
}
===========================================
构造函数
const DiscvoerCell(
{Key key,
@required this.title,
this.subTitle,
this.imageName,
this.subImageName}
)
: assert(title != null,'title 不能为空**'),assert(imageName != null,'imageName** 不能为空**'**);
@required表示必须传值,assert表示断言
===========================================
添加点击跳转事件
GestureDetector(
onTap: () {
Navigator
.of(context)
.push(
MaterialPageRoute(builder: (BuildContext context) {
return Discover_child_page(title:title);
}
)
);
},
child: Container(
)
)
=============================================
===========================================
===========================================
Listview.builder会根据数据重绘,需提供子部件数目和子部件创建
===========================================
===========================================
获取屏幕尺寸
_//_屏幕的宽高
double ScreenWidth (BuildContext context)=>MediaQuery.of(context).size.width;
double ScreenHeight (BuildContext context)=>MediaQuery.of(context).size.height;
===========================================
监控手势
===========================================
全局坐标转化为局部坐标
===========================================
创建匿名函数
===========================================
Future类型
Future<List>
异步执行的时候,有两种状态,正在执行和结束;结束有两种结果,成功和失败
===========================================
混入(Mixins)
用来为类增加功能,使用with
第一步
第二步
第三步
通过PageView实现保留部件。
===========================================
===========================================
混合开发
1.创建flutter_module
2.编辑Podfile,执行pod install
platform :ios, '9.0'
use_frameworks!
flutter_application_path = '/Users/zheNghh/Desktop/FlutterDemo/2021.04.28/flutter_module'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
target 'FlutterIos' do
install_all_flutter_pods(flutter_application_path)
end
3.关闭项目Bitcode功能
4.引入#import <Flutter/Flutter.h>
5初始化FlutterViewController并push或者present展示Flutter页面
FlutterViewController创建一次共用,内存不会自动释放
===========================================
显示不同页面
调用FlutterViewController中的- (void)setInitialRoute:(NSString*)route;方法传递route到Flutter中
在Flutter中import 'dart:ui’;后
通过window.defaultRouteName获取到传递的route
===========================================
通讯
MethodChannel
fultter对IOS通讯
fultter中使用
MethodChannel(channel名称).invokeMethod(‘方法名’,‘参数’);
IOS中
IOS对fultter通讯
IOS中
fultter中使用
===========================================
BasicMessageChannel
Flutter向iOS传递数据
Flutter
iOS监听
iOS向Flutter传递数据
Flutter监听
iOS发送