Flutter3.10介绍 https://medium.com/flutter/whats-new-in-flutter-3-10-b21db2c38c73
dart3介绍 https://medium.com/dartlang/announcing-dart-3-53f065a10635
Record
摘要:
● 记录是括在括号中的英文逗号分隔字段列表。
● 记录字段的类型可以各不相同,因此记录可以收集多种类型的数据。
● 记录可以同时包含已命名字段和位置字段,就像函数中的参数列表一样。
● 记录可以从函数中返回,因此可让您从函数调用返回多个值。
(String, int) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['height'] as int);
}
//位置字段,已命名字段
(String, {DateTime modified}) getMetadata() {
var title = "My Document";
var now = DateTime.now();
return (title, modified: now);
}
var metadataRecord = document.getMetadata();
print(metadataRecord.$1);
print(metadataRecord.modified);
//请从 $1 开始,并跳过已命名的字段
var record = (named: ‘v', ‘y', named2: ‘x', ‘z');
print(record.$1); // prints y
print(record.$2) // prints z
patterns
模式可以匹配和解构 https://dart.dev/language/patterns
if-case
(String, int) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['height'] as int);
}
/// 将记录解构为局部变量
var (String name, int height) = userInfo({'name': 'Michael', 'height': 180});
print('User $name is $height cm tall.');
switch-case
从 Dart 3 开始,switch 语句不再需要 break。非空 case 在到达主体末尾时会跳转到语句末尾。
///switch
/// 不需要加 break
/// 可以用 || && 逻辑运算符
switch (charCode) {
case slash when nextCharCode == slash:
skipComment();
case slash || star || plus || minus:
operator(charCode);
case >= digit0 && <= digit9:
number();
default:
invalid();
}
/// 新的语法,来根据case返回值
String describeDate(DateTime dt) =>
switch (dt.weekday) {
1 => 'Feeling the Monday blues?',
6 || 7 => 'Enjoy the weekend!',
_ => 'Hang in there.'
};
switch =>
Android studio 辅助功能将 switch 语句转为 switch 表达式
从对象模式中提取属性
guard子句
● guard 子句在 case 模式之后使用 when 关键字。
● 它们可用在 if-case、switch 语句和 switch 表达式中。
● 它们只会向匹配的模式添加条件。
● 如果 guard 子句求值为 false,则整个模式会被反驳,并接着执行下一个 case。
Sealed 封闭类 以编写详尽的switch
sealed 关键字是一个类修饰符,这意味着您可以仅在同一个库中扩展或实现此类。由于分析器知道此类的子类型,因此如果 switch 未能涵盖其中一个子类型且不详尽,分析器会报告错误。
/// sealed 密封类
sealed class Animal { … }
class Cow extends Animal { … }
class Sheep extends Animal { … }
class Pig extends Animal { … }
String whatDoesItSay(Animal a) =>
switch (a) { Cow c => '$c says moo', Sheep s => '$s says baa' };
//line 6 • The type 'Animal' is not exhaustively matched by the switch cases
//since it doesn't match 'Pig()'.
/// if (case) else 模式匹配解析
final json = {'name': 'Michael', 'height': 180};
// Find Michael's height.
if (json case {'name': 'Michael', 'height': int h}) {
print('Michael is $h cm tall.');
} else {
print('Error: json contains no height info for Michael!');
}
/// 变量模式 :modified 的语法是 modified: modified 的简写。
/// 如果您想要一个具有不同名称的新局部变量,可以改为写入 modified: localModified。
var (title, :modified) = document.getMetadata();
从json解析对象
根据类型返回值
class modifiers
类修饰符:语义更单一,功能更清晰
之前:class 可以被构造,继承或者实现
3.0增加了:
● interface class 只能被实现,不能被继承
● base class 不能被实现
● final class 不能被继承和实现
未来(不确定)
dart 语言
- inline class: for wrapping existing types with zero-cost "wrappers"
- primary constructors: a much more concise syntax for defining classes with a few fields and a primary constructor.
- macros(meta-programming):for enabling better deserialization of JSON (and similar), and for enabling data classes
原生接入
- compiles to C libraries with dart:ffi.
- Java interop using package:jnigen
- Objective-C and Swift interop using package:ffigen
Compilation to WebAssembly — targeting the web with native code
first preview of Dart to Wasm compilation
编辑dart到Wasm到意义:
- 减少加载时间
- 提高性能
- 实现各平台的一致性
dart3迁移指南 https://dart.dev/resources/dart-3-migration
评估版本稳定性&升级方案
结合changelog https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel
dart3 migration guide https://dart.dev/resources/dart-3-migration
break changes in flutter3.10 https://docs.flutter.dev/release/breaking-changes#released-in-flutter-310
Android Studio Flamingo upgrade
window deprecated
适配
- 有context:var view = View.of(context)
- 无context:var view = WidgetsBinding.instance.platformDispatcher.views.first;
a. 目前移动端是可以这样的,但是桌面端会有问题
package升级
依赖升级:调整sdk
environment:
sdk: '>=2.18.0 <4.0.0'
问题记录
升级dart3可能会出现以下问题
file: 6.x 在 dart3 环境编译失败
问题原因:dart3 新特性 class modifiers. 判定 File.create方法复写不合法
解决方案:override file: ^7.0.0
从 Flutter 3.10 开始,框架会在使用区域时检测不匹配情况,并在调试版本中将其报告给控制台。
主要影响基于runZoneGuarded
的异常捕获&上报逻辑
Sentry异常捕获修改方式
方案一,使用 PlatformDispatcher.instance.onError 替换 runZonedGuarded 作为获取异常信息的回调
推荐方案一
runApp(const FocusApp());
PlatformDispatcher.instance.onError =
(Object exception, StackTrace stackTrace) {
if (DelayInitSdk.isStarted) {
Sentry.captureException(exception, stackTrace: stackTrace);
return true;
}
return false;
};
方案二,将 WidgetsFlutterBinding.ensureInitialized(); 放到runZonedGuarded中执行
runZonedGuarded(
() {
WidgetsFlutterBinding.ensureInitialized();
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
runApp(const FocusApp());
},
(exception, stackTrace) {
if (DelayInitSdk.isStarted) {
Sentry.captureException(exception, stackTrace: stackTrace);
}
},
);
iOS设备通过Wi-Fi调试
弹出框里面填写设备的IP,无线局域网-点击连接的Wi-Fi的右侧感叹号图标- IP地址
有地球图标表示成功