<div id="qayss"></div>
  • <xmp id="qayss">
  • <small id="qayss"><small id="qayss"></small></small>
    <div id="qayss"></div>
  • <li id="qayss"></li>
  • <div id="qayss"><div id="qayss"></div></div>
  • <xmp id="qayss"><li id="qayss"></li>
    <div id="qayss"><li id="qayss"></li></div>
  • <small id="qayss"></small>
  • <div id="qayss"></div>
  • <xmp id="qayss"><div id="qayss"></div><div id="qayss"><div id="qayss"></div></div><xmp id="qayss">
    <small id="qayss"><div id="qayss"></div></small><div id="qayss"></div>
  • Dart 3 新特性 switch

    更新時間:2023-11-04 12:48

    Dart 3被描述為迄今為止最大的Dart版本。

    這個版本引入了一些重要的特性,例如:

    • 模式和記錄
    • 增強的switch和if-case語句
    • 解構
    • 封閉類和其他類修飾符

    這些特性在Flutter Forward首次宣布,并我很高興現在可以在Flutter 3.10和Dart 3.0正式發布后使用它們。

    實際上,Dart 3.0允許我們編寫更具表現力和優雅的代碼,但如果想充分利用它,會有一些學習曲線。

    由于需要涵蓋的內容很多,我決定寫一系列新文章,詳細介紹如何使用每個特性,以及您在現實世界中可能遇到的示例和實際用例。

    至于本文,我想為您展示一些Dart 3.0提供的特點。

    換句話說,這篇文章是前菜。接下來的將是主菜(和甜點 ??)。

    準備好了嗎?讓我們開始吧!

    在您的Flutter項目中啟用Dart 3

    要使用這些新特性,您需要在您的pubspec.yaml文件中啟用Dart 3.0:

    
    environment:
        sdk: '>=3.0.0 <4.0.0'
    

    在創建一個新的Flutter 3.10項目時,默認啟用Dart 3.0。

    有了這個設置,讓我們來了解一下新的語言特性。??

    Dart 3中的Records簡介

    Records非常靈活,可以在許多不同的場景中使用。

    舉個例子,想象一下,你正在進行網絡請求并獲得一些JSON數據,它看起來像這樣:

    
    final json = {'name': 'Andrea', 'age': 38, 'height': 184};
    

    如果您直接使用 json 變量,Dart 會將其推斷為 Map,從而失去類型安全性。

    為了改進這一點,您可以聲明一個 Person 類,并在一個工廠構造函數內實現反序列化邏輯:

    
    class Person {
        const Person({required this.name, required this.age, required this.height});
        final String name;
        final int age;
        final int height;
        factory Person.fromJson(Map<String, dynamic> json) {
          // * error handling code missing for simplicity
          return Person(
            name: json['name'],
            age: json['age'],
            data-height: json['height'],
          );
        }
      }
    
    
    (String, int, int) getPerson(Map<String, dynamic> json) {
        return (
          json['name'],
          json['age'],
          json['height'],
        );
      }
    
    
    final person = getPerson(json);
      print(person.$1); // 'Andrea'
      print(person.$2); // 38
      print(person.$3); // 184
    

    或者,您可以像這樣解構返回的值:

    
    final (name, age, height) = getPerson(json);
      print(name); // 'Andrea'
      print(age); // 38
      print(height); // 184
    

    但還有更多。??

    位置參數與命名參數

    在上面的示例中,記錄類型僅使用了位置參數(在其他編程語言中,這被稱為元組)。

    但 Dart 記錄也可以使用命名參數。

    這意味著如果我們希望,我們可以更改函數的返回類型:

    
    // same example as above, now using named arguments
      ({String name, int age, int height}) getPerson(Map<String, dynamic> json) {
        return (
          name: json['name'],
          age: json['age'],
          data-height: json['height'],
        );
      }
    

    因此,我們可以像這樣獲取和打印記錄的數值:

    
    final person = getPerson(json);
      print(person.name); // 'Andrea'
      print(person.age); // 38
      print(person.height); // 184
    
    
    // * we'll cover the : syntax in a follow up article
      final (:name, :age, :height) = getPerson(json);
      print(name); // 'Andrea'
      print(age); // 38
      print(height); // 184
    

    總體來說,可以將記錄視為類的輕量級替代品。

    MapList相比,記錄更加類型安全,因為它們允許您指定值的數量以及它們的類型。

    它們支持命名參數和位置參數(或二者的組合),就像常規函數參數一樣。

    正如我們所見,您可以使用解構來進一步簡化您的代碼。

    但如果您想要正確使用記錄并避免語法錯誤,需要遵循一些規則。因此,我將在即將發布的文章中更詳細地介紹它們。

    引介:Switch 表達式和模式

    假設我們正在編寫一個二維游戲,玩家可以向上、向下、向左和向右移動。

    這可以很容易地表示為一個枚舉:

    
    enum Move { up, down, left, right }
    

    現在,假設我們想根據當前的移動來計算特定的偏移量(作為一對x-y坐標)。在Dart 3之前,我們可能會像這樣實現所需的代碼:

    
    enum Move {
        up,
        down,
        left,
        right;
        Offset get offset {
          switch (this) {
            case up:
              return const Offset(0.0, 1.0);
            case down:
              return const Offset(0.0, -1.0);
            case left:
              return const Offset(-1.0, 0.0);
            case right:
              return const Offset(1.0, 0.0);
          }
        }
      }
    
    
    enum Move {
        up,
        down,
        left,
        right;
        Offset get offset => switch (this) {
              up => const Offset(0.0, 1.0),
              down => const Offset(0.0, -1.0),
              left => const Offset(-1.0, 0.0),
              right => const Offset(1.0, 0.0),
            };
      }
    

    只想在X軸上進行移動嗎?那么可以在switch語句內使用邏輯運算符來利用模式匹配:

    
    double get xAxisMovement => switch (this) {
              up || down => 0.0, // logical OR operator with pattern matching
              left => -1.0,
              right => 1.0,
            };
    

    Dart 3的switch表達式功能更加強大。

    因此,我將在另一篇文章中詳細介紹它們。??

    介紹封閉類

    封閉類有助于您檢查窮盡性,以便您可以處理所有可能的情況。

    在處理代碼中的異常時,這特別重要。

    例如,您可以使用封閉類來定義后端可能返回的所有可能的身份驗證異常:

    
    sealed class AuthException implements Exception {}
      class EmailAlreadyInUseException extends AuthException {
        EmailAlreadyInUseException(this.email);
        final String email;
      }
      class WeakPasswordException extends AuthException {}
      class WrongPasswordException extends AuthException {}
      class UserNotFoundException extends AuthException {}
    

    這讓你可以使用 switch 表達式處理每種可能的異常類型:

    
    String describe(AuthException exception) {
        return switch (exception) {
          EmailAlreadyInUseException(email: final email) =>
            'Email already in use: $email',
          WeakPasswordException() => 'Password is too weak',
          WrongPasswordException() => 'Wrong password',
          UserNotFoundException() => 'User not found',
        };
      }
    

    以上的代碼之所以有效,是因為AuthException類被聲明為sealed。

    如果沒有這個聲明,我們將會得到一個non_exhaustive_switch_expression錯誤:

    如果基類沒有被聲明為sealed,使用switch表達式時將會產生non_exhaustive_switch_expression錯誤。但如果我們將基類標記為sealed,編譯器就會知道我們已經處理了所有可能的情況。

    聲明一個sealed類有兩個重要的含義:

    • 該類變為抽象類(無法創建具體實例)
    • 所有的子類必須在同一個庫(文件)中定義。

    關于sealed類還有更多內容,敬請期待更深入的文章。??

    Dart 3中的類修飾符簡介

    在Dart 3之前,只有兩個類修飾符可用:abstractmixin。

    但在新版本中,我們有六個:

    • abstract(抽象)
    • base(基類)
    • final(最終)
    • interface(接口)
    • sealed(密封)
    • mixin(混入)

    方便的是,Dart官網有一個新頁面解釋了所有這些修飾符的工作原理:

    我可能會在將來更詳細地介紹這些修飾符,但目前來說,官方頁面是一個很好的起點。

    Dart 3: 下一步

    通過這篇文章,我希望為您展示了在Dart 3中可以做些什么。

    希望我的介紹能激發您嘗試在項目中使用這些新語言特性的興趣。

    但還有很多需要探討的內容,包括if-case語句、如何對可空值進行模式匹配以及其他高級用法。除非您深刻理解它們的工作原理,否則可能會遇到困難。

    曰本丰满熟妇XXXX性,一女多男在疯狂伦交,多人乱P杂交公车调教,成人AV在线一区二区三区
    <div id="qayss"></div>
  • <xmp id="qayss">
  • <small id="qayss"><small id="qayss"></small></small>
    <div id="qayss"></div>
  • <li id="qayss"></li>
  • <div id="qayss"><div id="qayss"></div></div>
  • <xmp id="qayss"><li id="qayss"></li>
    <div id="qayss"><li id="qayss"></li></div>
  • <small id="qayss"></small>
  • <div id="qayss"></div>
  • <xmp id="qayss"><div id="qayss"></div><div id="qayss"><div id="qayss"></div></div><xmp id="qayss">
    <small id="qayss"><div id="qayss"></div></small><div id="qayss"></div>