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

有地球图标表示成功
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容