Flutter札记

834 阅读4分钟

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

Rowchildren横向布局)

主轴mainAxisAlignment:MainAxisAlignment(左右)

交叉轴crossAxisAlignment:CrossAxisAlignment(上下)

当交叉轴设置.baseline时,对文本有效,需要同时设置下面属性

textBaselineTextBaseline.alphabetic

效果如下**:**

Columnchildren纵向布局)

Stackchildren层级布局)

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

fultterIOS通讯

fultter中使用

MethodChannel(channel名称).invokeMethod(‘方法名’,‘参数’);

IOS中

IOSfultter通讯

IOS中

fultter中使用

===========================================

BasicMessageChannel

FlutteriOS传递数据

Flutter

iOS监听

iOSFlutter传递数据

Flutter监听

iOS发送