技术小黑屋

Flutter 3 迁移后编译 Warnings 一键修复

当我们的 app 支持 flutter 3 后,无论是编译速度,还是运行效率,方方面面会有很大的提升。但是在我们编译的时候,会有类似下面的这些警告。

1
2
3
../../../your_pub/lib/src/framework.dart:275:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
[        ]  - 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('../../../code/flutter_3/packages/flutter/lib/src/scheduler/binding.dart').
[        ]     if (SchedulerBinding.instance!.schedulerPhase ==

上面的警告虽然不会影响应用的编译,但是长久来看,还是需要解决的。

原因为何

原因是从 flutter 3 开始, SchedulerBinding.instance返回的是一个 非 null 实例,当我们使用SchedulerBinding.instance!.schedulerPhase 会得到这样的警告Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.

如何解决

解决起来很简单,按照下面的处理,将!去掉即可。

1
SchedulerBinding.instance.schedulerPhase

都有哪些场景

flutter3 开始,下面这些都会有编译警告问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SchedulerBinding.instance!.xxx
SchedulerBinding.instance?.xxx

WidgetsBinding.instance!.xxxx
WidgetsBinding.instance?.xxxx

PaintingBinding.instance?.xxx
PaintingBinding.instance!.xxx


RendererBinding.instance!.xxx
RendererBinding.instance?.xxxx

GestureBinding.instance!.xxx
GestureBinding.instance?.xxx

一键解决

那这么多内容需要解决,有没有一键处理的办法呢?

如果你接触过 终端脚本,答案是肯定的。我们可以使用下面的shell 脚本处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env bash

function sedReplaceFile() {
  echo $1
  sed -i "" -e "s/SchedulerBinding.instance!/SchedulerBinding.instance/g" $1
  sed -i "" -e "s/SchedulerBinding.instance?/SchedulerBinding.instance/g" $1
  sed -i "" -e "s/WidgetsBinding.instance!/WidgetsBinding.instance/g" $1
  sed -i "" -e "s/WidgetsBinding.instance?/WidgetsBinding.instance/g" $1
  sed -i "" -e "s/PaintingBinding.instance?/PaintingBinding.instance/g" $1
  sed -i "" -e "s/PaintingBinding.instance!/PaintingBinding.instance/g" $1
  sed -i "" -e "s/RendererBinding.instance!/RendererBinding.instance/g" $1
  sed -i "" -e "s/RendererBinding.instance?/RendererBinding.instance/g" $1
  sed -i "" -e "s/GestureBinding.instance!/GestureBinding.instance/g" $1
  sed -i "" -e "s/GestureBinding.instance?/GestureBinding.instance/g" $1
  
}

export -f sedReplaceFile
find . -name "*.dart"  | xargs -I {} bash -c 'sedReplaceFile {}'

执行

1
2
cd your_project
f3_fix.sh

  • 上面的脚本仅在 mac 系统验证, Linux 可能需要自行做简易修改。
  • 如果是 三方pub 包含警告问题,可以选择对应适配 flutter 3 的版本升级即可。




快来解锁最新版 Typora,新用户券后仅需 84 元!
如何便宜的购买 office 365 ?
新版赤友 NTFS 助手来袭,正版超低价