
正文
flutter关闭空安全 flutter销毁页面
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Flutter升级Dart版本支持空安全,原项目报错的处理
Dart支持空安全已经很久了,我们的项目在开发初期还没有空安全这回事,之前使用Swift开发过一段时间,领略过空安全的好处,于是升级了一下dart版本,升级后发现项目整体爆红,基本每个问题件都报错,一番摸索之后发现两种方式可解决该问题
1、第一种:在 dart 和 flutter 命令里,加入 --no-sound-null-safety 标记禁用
2、有人说在程序入口的第一行即main()的第一行添加// @dart=2.9以限定dart版本,亲测不好用,不知道是不是我加的地方有问题,但是在每个报错文件第一行都添加// @dart=2.9是好用的,这个还需要进一步探索
3、 最后是设置环境的sdk版本最低2.11.0
相关问答
Q1: Flutter 升级空安全攻略
1、升级依赖的插件版本pubspec.yaml(包括example),pub get 解决依赖冲突
2、pubspec.yaml所在路径下执行 dart pub upgrade --null-safety 检查是否所在flutter工程依赖库是否都升级到了空安全版本
example示例需要进入example路径下检查
1、List默认构造方法删除,改用[];
main.dart文件main方法第一行增加CustomFlutterBinding();
2、flutter clean,删除所有 pubspec.lock文件 ,pub get
3、FutureOr报错引入头文件、import 'dart:async';
4、属性用优先用late 或者 ?声明,在确定不为空情况才用!
Q2: Flutter 常见警告
1、Avoid empty catch blocks.
如果try catch 中的catch没有任何实现则需要把catch的e异常改为_即可消除警告
2、Prefer const with constant constructors.
意思是需要加上const常量修饰符
3、Prefer using if null operators.
发生在使用三目运算符当中
4、The '!' will have no effect because the receiver can't be null.
在定义空安全之后的使用中
5、Don't access members with this unless avoiding shadowing.
引用了this关键字
6、SizedBox for whitespace.
使用Container布局
6、Unnecessary new keyword.
创建布局控件时使用new关键字
7、Avoid using braces in interpolation when not needed.
日志输出的时候对于单独的变量使用了大括号
8、Use key in widget constructors.
定义的StatefulWidget 中没有添加构造方法
9、The method doesn't override an inherited method.
定义方法之前添加了@override
Q3: flutter项目升级2.0过程填坑记录
在此之前先推荐看大佬的: 填坑指导
iOS需要注意:
1、flutter2.0要求cocoapods 升级到1.9.0
详情看这篇博客
2、原来flutter项目中的podfile文件是旧版本的ccocoapods了,删除podfile和对应的.lock,然后flutter项目重新运行使用它自动生成的podfile文件
3、安装CocoaPods
卸载cocoapods:sudo gem uninstall cocoapods
查看cocoapods版本:pod --version
指定版本安装:
sudo gem install -n /usr/local/bin cocoapods -v 1.9.3(新MacOS系统升级)
不指定版本安装
sudo gem install -n /usr/local/bin cocoapods
说明 :老项目sdk1.17.0===升级到2.0.1,当前所有操作基于win平台
到此为止环境已经准备妥当,正式进入项目修改。
所有的插件都要适配到空安全,插件是否支持均会有对应说明Null safety,适配过程不确定版本的话,可以使用dio: any,适配完事后再在pubspec.lock文件中查看具体的版本修改过来,实在有部分插件没有支持的,参考下面
部分插件在适配空安全的版本放弃维护了,得自行更新或寻找替代,如: flutter_swiper 变为 flutter_swiper_null_safety ,插件更新后要注意项目中的用法是否需要更新
2.1.1: 以前采用的是 provide 插件共享全局数据,现在变化为 provider ,用法改变, 点击参考 ,以防文章丢失,我重复一遍:
比如:
2.1.2: dio版本升级到4.0.0最新版后,部分用法改变
2.2.1
2.2.2
解决方案:
2.2.3
解决方案:
2.2.4
解决方案:
2.2.5
解决方案:
2.2.6
解决方案:
2.2.7
解决方案:
2.2.8
解决方案: child 换为sliver
2.2.8.1
解决方案: 项目目录下: android--app-build.gradle --minSdkVersion改为:18 或者19
2.2.8.2
解决方案: 在pubspec.yarm管理里面添加:publish_to
2.2.8.3
解决方案: video_player升级后字段发生了变化,initialized字段更换为:isInitialized(_controller.value.isInitialized)
2.2.8.4
解决方案:
2.2.8.5
解决方案:
2.2.8.6
解决方案: 方案一:删除ios目录下的Podfile.lock 文件然后重新运行 pod install命令
方案二:删除ios目录下的Podfile.lock与Podfile文件 重新运行flutter run或flutter build ios
方案三:删除ios目录,重新运行 flutter create . 命令,注意有"."这个符号不要忘记
2.2.8.7
这个报错一般对应的就是下面的报错,注意看后面的报错信息,看是哪个插件报错。
解决方案: 把Podfile的版本注释打开,改为platform :ios, '9.0' 或者是更高的版本
全局替换
1.将new List() 替换为[];
2.TextField的inputFormatters:[WhitelistingTextInputFormatter.digitsOnly] 替换为[FilteringTextInputFormatter.digitsOnly]
3.TextField的inputFormatters:[WhitelistingTextInputFormatter(RegExp("[a-z|A-Z|0-9]"))]替换为FilteringTextInputFormatter.allow(RegExp("[a-z|A-Z|0-9]"))
4.Stack组件中overflow: Overflow.visible改为 clipBehavior: Clip.none;overflow: Overflow.clip改为clipBehavior:Clip.hardEdge
5.ListWheelScrollView组件中clipToSize = false改为clipBehavior: Clip.none,clipToSize = true改为 Clip.hardEdge
6.TextField中maxLengthEnforced: true改为maxLengthEnforcement:MaxLengthEnforcement.enforced
7.FlatButton、RaisedButton、OutlineButton的变化: 官方参考
颜色的属性发生了变化,由原来的Color 变为了MaterialStatePropertyColor, 这是未了解决不同状态(pressed、hovered、focused、disabled)下按钮颜色的变化
例如
8.出现如下警告
9.showSnackBar报错误
解决方案: Scaffold换为ScaffoldMessenger
10.textSelectionColor弃用
解决方案:
11.charts_flutter升级后属性报错
解决方案:
12.flutter 真机调试无法访问网络,dio报错
解决方案:
android:
ios:
问题12完整参考
Q4: Flutter io 网络请求中HttpClient().close()有什么意义? 关闭网络请求的目的是什么?真的能关闭掉吗?
在Flutter中,使用HttpClient进行网络请求时,通常使用'HttpClientHttpClient的'关闭close方法来释放资源并关闭连接。这个方法的主要目的是防止网络资源被浪费,从而提高网络请求的效率。
具体来说,网络请求需要占用一定的资源,如网络带宽、内存等,如果不及时关闭网络连接,可能会导致资源浪费和程序的性能下降。此外,长时间占用网络资源也可能会导致网络拥塞和其他问题,因此及时关闭网络连接也有助于维护网络的正常运行。
在使用HttpClient时,可以通过'关闭close方法来显式地关闭网络连接,释放占用的资源。不过需要注意的是,如果网络请求还没有完成,直接关闭网络连接可能会导致请求失败。因此,需要在确保请求完成后再关闭网络连接。
在实际开发中,Flutter也提供了其他更高级的网络请求方式,如'Dioclose方法。
Q5: flutter 单例的写法, dio的封装
直接进入正题
新建一个NetworkTool工具类,下面是适配了Dart空安全的写法
接下来我们来测试一下,是不是同个实例,用 identical(Object a, Object b) ,如果a和b是同一个实例,则会返回true,否则返回false;
结果如下:
可以看出来,我们单例的写法没有什么问题,不管是调用getter方法 NetworkTool.instance ,还是调用工厂构造方法 NetworkTool() ,创建出来的实例都是同一个。
我们来封装一下Dio这个http请求库,只作简单的演示
外面的使用如下:
结果当然也是返回true;
使用如下:
希望看完此文章后,小伙伴们自己可以写出单例出来, 至少见到其他人的单例写法,心里不慌,完全看得懂,hold得住!
小伙伴们,今天的分享至此结束! 如果小伴们,觉得有点用的话,或者已经看到这里面来的请加关注及点个赞吧~~ 后续会分享更多有关flutter的文章。如果有疑问的话,请在下方留言~
关于flutter关闭空安全和flutter销毁页面的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








