Flutter Notes
dialog变化高度
SingleLineFittedBox自动适配文本你的大小来适配固定的空间完全展示
1 |
|
dart注解
1 |
|
Flutter去掉按钮的点击效果
https://blog.7-ik.com/index.php/archives/190/
flutter如何禁止listview滑动
ListView禁止用户上下滑动可以使用physics属性
1 |
|
TickerProviderStateMixin
Flutter try catch
Flutter与原生交互的数据类型
Dart | Java | Kotlin | Obj-C | Swift |
---|---|---|---|---|
null | null | null | nil (NSNull when nested) | nil |
bool | java.lang.Boolean | Boolean | NSNumber numberWithBool: | NSNumber(value: Bool) |
int | java.lang.Integer | Int | NSNumber numberWithInt: | NSNumber(value: Int32) |
int, if 32 bits not enough | java.lang.Long | Long | NSNumber numberWithLong: | NSNumber(value: Int) |
double | java.lang.Double | Double | NSNumber numberWithDouble: | NSNumber(value: Double) |
String | java.lang.String | String | NSString | String |
Uint8List | byte[] | ByteArray | FlutterStandardTypedData typedDataWithBytes: | FlutterStandardTypedData(bytes: Data) |
Int32List | int[] | IntArray | FlutterStandardTypedData typedDataWithInt32: | FlutterStandardTypedData(int32: Data) |
Int64List | long[] | LongArray | FlutterStandardTypedData typedDataWithInt64: | FlutterStandardTypedData(int64: Data) |
Float64List | double[] | DoubleArray | FlutterStandardTypedData typedDataWithFloat64: | FlutterStandardTypedData(float64: Data) |
List | java.util.ArrayList | List | NSArray | Array |
Map | java.util.HashMap | HashMap | NSDictionary | Dictionary |
Flutter设置渐变背景
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFFfbab66), Color(0xFFf7418c)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
)),
);
Flutter中Image组件设置大小失败
解决办法如下, 给Image套一个Center组件
1 |
|
flutter中键盘处理, flutter中在dialog中处理键盘高度的问题
推荐使用flutter_keyboard_visibility去监听键盘的状态
Flutter之三种依赖方式
1 |
|
路径依赖
路径依赖,可以通过文件系统的path:依赖包。 路径可以是相对的,也可以是绝对的。 例如,要依赖位于应用相邻目录中的插件’plugin1’
1 |
|
git依赖
git依赖,可以依赖Git仓库中的包。 默认情况下,会去Git存储库的根目录中寻找包,如下:
1 |
|
我们可以制定路径来依赖:
1 |
|
我们也可以指定commit,branch或tag:
1 |
|
pub依赖
通过pub包仓库进行依赖
这两个是一样的,可以使用任何版本的包
1 |
|
指定范围,使用1.2.3 ~ 2.0.0的包:
1 |
|
指定pub仓库源:
1 |
|
也可以指定版本:
1 |
|
flutter中隐藏控件的三种方式
-
Opacity: 其实是根据visible 控制透明度而已,其实还是占位的
-
Offstage`为true时表示不渲染,也不占位
-
Visibilty通过设置visible来展示或者隐藏子控件,不占位,并且可以设置在隐藏子控件时展示占位控件 常用属性
-
通过变量控制 visible ? Padding(padding: EdgeInsets.all(30), child: Text(‘yechaoa’)) : Container(),
Flutter中文本控件文本的垂直居中简单处理方法
在TextStyle设置height:1.1,字体不同值不同,全部代码如下:
1 |
|
flutter版本升级之后对空安全支持的修改
原生跳转flutter的实现
参考:
https://blog.csdn.net/wangtianya125/article/details/123046217
https://blog.51cto.com/928343994/2841654
dart插件
MediaQuery
MediaQueryData是MediaQuery.of获取数据的类型。说明如下:
属性 说明 size 逻辑像素,并不是物理像素,类似于Android中的dp,逻辑像素会在不同大小的手机上显示的大小基本一样,物理像素 = size*devicePixelRatio。 devicePixelRatio 单位逻辑像素的物理像素数量,即设备像素比。 textScaleFactor 单位逻辑像素字体像素数,如果设置为1.5则比指定的字体大50%。 platformBrightness 当前设备的亮度模式,比如在Android Pie手机上进入省电模式,所有的App将会使用深色(dark)模式绘制。 viewInsets 被系统遮挡的部分,通常指键盘,弹出键盘,viewInsets.bottom表示键盘的高度。 padding 被系统遮挡的部分,通常指“刘海屏”或者系统状态栏。 viewPadding 被系统遮挡的部分,通常指“刘海屏”或者系统状态栏,此值独立于padding和viewInsets,它们的值从MediaQuery控件边界的边缘开始测量。在移动设备上,通常是全屏。 systemGestureInsets 显示屏边缘上系统“消耗”的区域输入事件,并阻止将这些事件传递给应用。比如在Android Q手势滑动用于页面导航(ios也一样),比如左滑退出当前页面。 physicalDepth 设备的最大深度,类似于三维空间的Z轴。 alwaysUse24HourFormat 是否是24小时制。 accessibleNavigation 用户是否使用诸如TalkBack或VoiceOver之类的辅助功能与应用程序进行交互,用于帮助视力有障碍的人进行使用。 invertColors 是否支持颜色反转。 highContrast 用户是否要求前景与背景之间的对比度高, iOS上,方法是通过“设置”->“辅助功能”->“增加对比度”。 此标志仅在运行iOS 13的iOS设备上更新或以上。 disableAnimations 平台是否要求尽可能禁用或减少动画。 boldText 平台是否要求使用粗体。 orientation 是横屏还是竖屏。
flutter 异步编程, async, async*, yield, yield*, future, stream,then等
学习资料:
flutter中Appbar嵌套Tabbar使用是, 如果需要在Tabbar中添加组件, 那么需要将Tabbar嵌套在PreferredSize中,例如:
1 |
|
flutter弹窗showBarModalBottomSheet出现黑边问题:
自定义shape属性即可,如下:
1 |
|
dart中一切接对象, 所以函数的传值都是传递引用
如果要使用值传递, 直接传递一个json,然后转对象
Mediaquery详解
flutter中textfield的焦点事件
要使用FocusScope.of(context).requestFocus()需要先定义一个FocusNode
1 |
|
获取焦点
当点击时用FocusScope.of(context).requestFocus()获取焦点
1 |
|
失去焦点
当发送留言之后可以通过unfocus()让其失去焦点
1 |
|
Flutter textfield控制光标位置
把光标移到最后
1 |
|
让TextField 全选
_editingController.selection = TextSelection(baseOffset:0 , extentOffset: text.length);
flutter获取图片宽高
通过在其ImageProvider上调用resolve来读取ImageStream
1.本地图片宽高获取
1 |
|
2.网络图片宽高获取
1 |
|
flutter textfield控制长度
1 |
|
flutter日期格式化
1 |
|
1 |
|
1 |
|
flutter组件隐藏显示
1 |
|
flutter sliver系列组件
flutter颜色十六进制字符串转化
1 |
|
flutter修改状态栏颜色
使用 AnnotatedRegion 组件修改状态栏文字颜色
1 |
|
flutter随机数
1 |
|
flutter监听页面的手势返回
flutter中Appbar中actions大小控制
actions中设置控件的大小没有用, 只需要设置padding就行了.
flutter中什么对象需要dispose
flutter毫米转像素
flutter中Container透明部分不响应事件
解决办法如下:
1,将GestureDetector的 behavior 属性设置为 opaque 或 translucent(behavior: HitTestBehavior.opaque)
2,将Container设置背景颜色
flutter读取userdefault里面的信息
flutter sharedpreference各自封装的iOS和安卓的本地化存储方案, iOS中能直接对接原生的 nsuserdefault, 原生通过’flutter.key’能获取flutter中以key存储的值
flutter判断当前页面是否为某个页面
使用全局变量记录栈顶页面, 配合路由使用, 一定要注意和原生交互产生的新页面
flutter给Container添加阴影
关键代码:
1 |
|
flutter圆角组件
在这里使用 Container 容器来实现圆角矩形边框效果,但是要注意,Container组件只能自己圆角不能裁剪子组件, 还有其他的圆角组件ClipRRect、ClipOval、CircleAvatar、BoxDecoration BorderRadius.circular、BoxDecoration BoxShape.circle再文末简单介绍一下
1 圆角矩形边框
1 |
|
2 圆角矩形边框
1 |
|
3 可点击的圆角矩形边框
使用 InkWell 来实现 ,更多关于 InkWell 可查看 flutter InkWell 设置水波纹点击效果详述
1 |
|
4 可点击的圆角矩形边框
1 |
|
1.ClipRRect:将 child 剪裁为宽高相等的圆角组件,可设置圆角度数
1 |
|
![img](https:////upload-images.jianshu.io/upload_images/7254079-4f3b7a22cd5efd35.png?imageMogr2/auto-orient/strip | imageView2/2/w/240) |
ClipRRect.png
2.ClipOval: 将child裁剪为宽高相等的圆角组件(只包括圆形和椭圆形),不可设置圆角度数
1 |
|
![img](https:////upload-images.jianshu.io/upload_images/7254079-02c323fd79dd2f8e.png?imageMogr2/auto-orient/strip | imageView2/2/w/241) |
ClipOval.png
3.CircleAvatar:只能设置自身圆形,不能裁剪child
1 |
|
![img](https:////upload-images.jianshu.io/upload_images/7254079-956fe20648f70300.png?imageMogr2/auto-orient/strip | imageView2/2/w/231) |
CircleAvatar.png
4.BoxDecoration BorderRadius.circular 设置自身圆角,不能裁剪child
1 |
|
![img](https:////upload-images.jianshu.io/upload_images/7254079-d736ee65115e9e9f.png?imageMogr2/auto-orient/strip | imageView2/2/w/240) |
BorderRadius.png
4.BoxDecoration BoxShape.circle 只能设置自身为圆形,不能裁剪child
1 |
|
![img](https:////upload-images.jianshu.io/upload_images/7254079-e3153cd177d1a8b9.png?imageMogr2/auto-orient/strip | imageView2/2/w/231) |
BoxShap.png
获取系统语言
1 |
|
flutter如何获取页面加载完成的时机?
Flutte类型转换
字符串和int
1 |
|
舍弃小数部分(取整)
首先我们来看如何只保留整数位,这里有很多方法可以实现:
1 |
|
根据自己的需求,是否需要四舍五入等,选择一个合适的方法即可。
保留小数点后 n 位
如果我们想要控制浮点数的精度,想要保留小数点后几位数字,怎么实现?
最简单的是使用 toStringAsFixed() 方法:
1 |
|
注意,toStringAsFixed() 方法会进行四舍五入。
TextButton取消点击效果
详细使用方式如下:
1 |
|
数组删除元素问题
删除元素方式很多,常用两种方式如下:
1 |
|
以上两种方式中, 当删除的元素是很复杂的模型是,由于某些原因删除会不成功, 稳妥起见推荐使用第二种方式.
焦点事件
1 |
|
1 |
|
1 |
|
1 |
|
Flutter延时执行
flutter中可以通过Future.delay或者Timer来达到延时执行的目的,示例代码如下:
1 |
|
或者使用Timer达到相同的效果:
1 |
|
添加新图片之后无法找到
解决办法:删除app后重新运行
WidgetsBindingObserver监测页面生命周期
1 |
|
Flutter布局随键盘顶起来问题
在Scaffold加属性
1 |
|
flutter嵌套原生试图(iOS端)
-
创建工厂类,代码如下:
头文件
#import <Foundation/Foundation.h> #import <Flutter/Flutter.h> @interface FLNativeViewFactory : NSObject <FlutterPlatformViewFactory> @property(nonatomic,strong)NSObject<FlutterBinaryMessenger> *message; -(instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger; @end
实现文件:
#import "FLNativieViewFactory.h" #import "JCFLWebView.h" @implementation FLNativeViewFactory -(instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger> *)messenger { if (self = [super init]) { _message = messenger; } return self; } -(nonnull NSObject<FlutterPlatformView> *)createWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args { return [[JCFLWebView alloc] initWithFrame:frame viewIdentifier:viewId arguments:args binaryMessenger:self.message]; } -(NSObject<FlutterMessageCodec> *)createArgsCodec { return [FlutterStandardMessageCodec sharedInstance]; } @end
-
创建具体的试图管理类
头文件:
#import <Foundation/Foundation.h> #import <Flutter/Flutter.h> NS_ASSUME_NONNULL_BEGIN @interface JCFLWebView : NSObject<FlutterPlatformView> -(instancetype)initWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger; -(UIView*)view; @end NS_ASSUME_NONNULL_END
实现文件:
#import "JCFLWebView.h" #import "FLNativieViewFactory.h" #import "JCWKWebViewController.h" @implementation JCFLWebView { UIView *_view; } -(instancetype)initWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger { if (self = [super init]) { _view = [[UIView alloc] init]; } return self; } -(UIView*)view { return _view; } @end
-
在appdelegate中注册(注意idstring要和flutter中的一致)
NSObject<FlutterPluginRegistrar>* registrar = [self registrarForPlugin:@"jcwebview_plugin"]; FLNativeViewFactory* factory = [[FLNativeViewFactory alloc] initWithMessenger:registrar.messenger]; [registrar registerViewFactory:factory withId:@"idstring"];
-
flutter代码:
1
2
3
4
5UiKitView( viewType: 'idstring', creationParams: creationParams, creationParamsCodec: const StandardMessageCodec(), )
-
Flutter打包web项目
-
开启web功能支持
flutter config --enable-web
,执行完之后需要重启编辑器 -
打开已有项目进入到根目录,执行
flutter create .
开始创建web
目录文件,执行完毕后,在项目中多了个一个web目录, 如果需要开启null safety
,执行dart migrate --apply-changes
-
执行
flutter build web
编译web项目
Dart异步编程实现
Flutter多个第三方依赖库版本冲突问题:
项目依赖如下几个包
1 |
|
执行pub get之后就会报错:
1 |
|
如果要自己去找合适的版本好解决冲突问题,很麻烦, 最好的办法如下:
第一步: 修改依赖包为如下写法:
1 |
|
第二部:执行 pub get
第三部:打开工程目录下pubspec.lock
文件, 然后找到对应的依赖库以及器版本号,最后第一步中的any,替换成pubspec.lock
文件中的对应的版本好即可
单例模式
1 |
|
区分生产测试环境
1 |
|
文本框换行
使用Expanded包一层:
1 |
|
Dart关键词
factory
一. 官方的描述
当你使用factory关键词时,你能控制在使用构造函数时,并不总是创建一个新的该类的对象,比如它可能会从缓存中返回一个已有的实例,或者是返回子类的实例。
二. 3个使用场景
- 避免创建过多的重复实例,如果已创建该实例,则从缓存中拿出来。
- 调用子类的构造函数(工厂模式 factory pattern)
- 实现单例模式
dynamic
dynamic类型具有所有可能的属性和方法。Dart语言中函数方法都有dynamic类型作为函数的返回类型,函数的参数也都有dynamic类型。
其实dynamic不是实际的type,而是类型检查开关。一个变量被dynamic修饰,相当于告诉static type 系统“相信我,我知道我自己在做什么”。例如:
1 |
|
异步UI处理: FutureBuilder和StreamBuilder
FutureBuilder直接收一个异步操作
StreamBuilder可接受多个异步操作,常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。
泛型:
- 泛型方法
- 泛型类
- 泛型接口
ChangeNotifier使用方法
- 定义一个数据Model类,继承自ChangeNotifier
- 使用ChangeNotifierProvider组件来将Model与Widget相关联
- 更新UI: 有如下两种方法:
- 定义监听者Consumer,获取Model的值来
- 使用Provider.of来更新数据
代码示例如下:
定义一个数据Model类,继承自ChangeNotifier
1 |
|
使用ChangeNotifierProvider组件来将Model与Widget相关联
1 |
|
如果你想提供更多状态,可以使用 MultiProvider:
1 |
|
定义监听者Consumer,获取Model的值来
1 |
|
使用Provider.of来更新数据
1 |
|
Dart中的extends、with、implements
1. extends:继承
1 |
|
2. with:混合mixin
1 |
|
3. implements: 实现接口
1 |
|
Space和 SizedBox
-
SizedBox:
精准控制child尺寸。 精准定义 widget之间的间隔。此时SizedBox没有定义child
-
Spacer作用:
通过Flex 创建widget之前的空间。
WidgetsBinding.instance.addPostFrameCallback
addPostFrameCallback 是 StatefulWidge 渲染(build)结束(build)的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用,addPostFrameCallback 的使用方法是在 initState 里添加回调:
1 |
|
Flutter App 的生命周期
1. APP生命周期相关的函数
1 |
|
2.. 使用WidgetsBindingObserver实现生命周期监听的方法:
1 |
|
组件生命周期
StatelessWidget
的生命周期,从源码中可以看到StatelessWidget
的生命周期只有一个build
方法。- StatefulWidget的生命周期如下:
生命周期方法 | 调用时机 | 执行次数 |
---|---|---|
createState | 创建State对象前 | 1 |
constructor | 创建State对象时 | 1 |
initState | 当State 对象插入视图树之后 | 1 |
didChangeDepandencies | State 对象的依赖关系发生变化后 | >=1 |
build | State 改动之后 | >=1 |
addPostFrameCallback | 首帧渲染结束的回调 | 1 |
setState | 需要刷新 UI 时 | >=1 |
didUpdateWidget | widget 配置发生变化时,如调用 setState 触发 | >=1 |
deactivate | widget 不可见时 | >=1 |
dispose | widget 被永久移除 | 1 |
- Json序列化
Flutter常用命令列表
命令 | 命令解释 | 参数 |
---|---|---|
flutter emulators | 获取可用模拟器列表 | –launch xxx (启动模拟器xxx) |
flutter devices | 获取真机设备列表 | |
flutter run -t 文件路径 | 指定启动文件 | lib/main_local.dart |