Flutter3.10 & Dart3 升级

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

image.png

image.png
image.png
(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 表达式


从对象模式中提取属性

image.png

guard子句

● guard 子句在 case 模式之后使用 when 关键字。
● 它们可用在 if-case、switch 语句和 switch 表达式中。
● 它们只会向匹配的模式添加条件。
● 如果 guard 子句求值为 false,则整个模式会被反驳,并接着执行下一个 case。


image.png

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解析对象


image.png

根据类型返回值


image.png

class modifiers

类修饰符:语义更单一,功能更清晰
之前:class 可以被构造,继承或者实现
3.0增加了:
● interface class 只能被实现,不能被继承
● base class 不能被实现
● final class 不能被继承和实现

未来(不确定)

dart 语言

  1. inline class: for wrapping existing types with zero-cost "wrappers"
  2. primary constructors: a much more concise syntax for defining classes with a few fields and a primary constructor.
  3. 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


image.png

window deprecated


image.png

image.png

适配

  1. 有context:var view = View.of(context)
  2. 无context:var view = WidgetsBinding.instance.platformDispatcher.views.first;
    a. 目前移动端是可以这样的,但是桌面端会有问题

package升级
依赖升级:调整sdk

environment:
  sdk: '>=2.18.0 <4.0.0'

问题记录

升级dart3可能会出现以下问题

  1. file: 6.x 在 dart3 环境编译失败
    问题原因:dart3 新特性 class modifiers. 判定 File.create方法复写不合法
    解决方案:override file: ^7.0.0

  2. "Zone mismatch" message

从 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调试

image.png

image.png

image.png

弹出框里面填写设备的IP,无线局域网-点击连接的Wi-Fi的右侧感叹号图标- IP地址


image.png

有地球图标表示成功
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容