在 dart fluter 中使用 typedef

會煮咖啡的貓發表於2021-07-20

老鐵記得 轉發 ,貓哥會呈現更多 Flutter 好文~~~~

微信群 ducafecat

b 站 space.bilibili.com/404904528

原文

medium.com/flutterdevs…

參考

正文

在這個部落格中,我們將探索 TypeDef In Dart & Fluter。它告訴你在 Dart 中使用 typedef 的最好方法。它同樣工程在 Flutter 和有一個利用例子在您的 Flutter 應用程式。

在 Dart 中,您可以使用 typedef 關鍵字建立型別別名來使用某種型別。本文介紹瞭如何製作函式型和非函式型的 typedef,以及如何利用所製作的 typedef。

如何為函式使用 typedef

Typedef 關鍵字最初是在 Dart 1 中使用的,用來暗示函式。在 Dart 1 中,如果需要將函式用作變數、欄位或邊界,則需要首先使用 typedef。

要使用型別別名,只需將函式標記降級為 typedef。從那時起,您可以使用 typedef 作為變數、欄位或邊界,如下面的模型所示。

typedef IntOperation<int> = int Function(int a, int b);

int processTwoInts (IntOperation<int> intOperation, int a, int b) {
  return intOperation(a, b);
}

class MyClass {

  IntOperation<int> intOperation;

  MyClass(this.intOperation);

  int doIntOperation(int a, int b) {
    return this.intOperation(a, b);
  }
}

void main() {
  IntOperation<int> sumTwoNumbers = (int a, int b) => a + b;
  print(sumTwoNumbers(2, 2));

  print(processTwoInts(sumTwoNumbers, 2, 1));

  MyClass myClass = MyClass(sumTwoNumbers);
  print(myClass.doIntOperation(4, 4));
}
複製程式碼

當我們執行應用程式時,我們應該得到螢幕的輸出,就像螢幕下方的最終輸出一樣:

4
3
8
複製程式碼

下面是函式具有泛型引數型別的另一個模型。

typedef Compare<T> = bool Function(T a, T b);
bool compareAsc(int a, int b) => a < b;
int compareAsc2(int a, int b) => a - b;

bool doComparison<T>(Compare<T> compare, T a, T b) {
  assert(compare is Compare<T>);
  return compare(a, b);
}

void main() {
  print(compareAsc is Compare<int>);
  print(compareAsc2 is Compare<int>);

  doComparison(compareAsc, 1, 2);
  doComparison(compareAsc2, 1, 2);
}
複製程式碼

當我們執行應用程式時,我們應該得到螢幕的輸出,就像螢幕下方的最終輸出一樣:

true
false
true
複製程式碼

自從 Dart 2 之後,你可以在任何地方使用函式型別的標點符號。因此,再使用 typedef 並不重要。另外還表示喜歡行內函數型別。這是因為閱讀程式碼的個人可以直接看到函式型別。下面是可以與沒有 typedef 的主體模型進行比較的內容。

int processTwoInts (int Function(int a, int b) intOperation, int a, int b) {
  return intOperation(a, b);
}

class MyClass {

  int Function(int a, int b) intOperation;

  MyClass(this.intOperation);

  int doIntOperation(int a, int b) {
    return this.intOperation(a, b);
  }
}

void main() {
  int Function(int a, int b) sumTwoNumbers = (int a, int b) => a + b;
  print(sumTwoNumbers(2, 2));

  print(processTwoInts(sumTwoNumbers, 2, 1));

  MyClass myClass = MyClass(sumTwoNumbers);
  print(myClass.doIntOperation(4, 4));
}
複製程式碼

儘管如此,如果函式很長而且大部分時間被利用,那麼使用 typedef 很有價值。

對 Non-Functions 使用 typedef:

在 Dart 2.13 之前,你可以使用 typedef 來處理函式型別。自從 Dart 2.13 以來,你同樣可以使用 typedefs 來建立暗示非函式的型別別名。使用基本上是相同的,你只需要允許型別作為一個 typedef。

首先,你的 Dart 表格應該是 2.13 或以上版本。為 Flutter,你需要利用版本 2.2 或以上。此外,您還需要在 pubspec 中重新整理基本 SDK 表單。Yaml to 2.13.0 and run bar get (for Dart)或 Flutter pub get (for Flutter)。

environment:
  sdk: ">=2.13.0 <3.0.0"
複製程式碼

例如,您需要描述儲存整數資料列表的型別。由於這個原因,您可以建立一個 typedef,其型別是 List <int> 。之後,如果需要描述用於放置資訊顯示的變數,可以使用 typedef 作為型別。在下面的模型中,我們刻畫了一個型別為 List <int> 的被認為是 DataList 的 typedef。正如您可以在下面的程式碼中找到的,利用 typedef 可以給您提供與利用實際型別相似的操作。您可以直接降級列表值,並訪問 List 的技術和屬性。如果你檢查 runtimeType,你會得到 List <int> 作為結果。

typedef DataList = List<int>;

void main() {
  DataList data = [50, 60];
  data.add(100);
  print('length: ${data.length}');
  print('values: $data');
  print('type: ${data.runtimeType}');
}
複製程式碼

當我們執行應用程式時,我們應該得到螢幕的輸出,就像螢幕下方的最終輸出一樣:

length: 3
values: [50,60,100]
type: List<int>
複製程式碼

與變數不同,型別別名同樣可以用作技術的欄位、引數和返回值。

typedef DataList = List<int>;

class MyClass {

  DataList currentData;

  MyClass({required this.currentData});

  set data(DataList currentData) {
    this.currentData = currentData;
  }

  ScoreList getMultipliedData(int multiplyFactor) {
    DataList result = [];

    currentData.forEach((element) {
      result.add(element * multiplyFactor);
    });

    return result;
  }
}

void main() {
  MyClass myClass = MyClass(currentData: [50, 60, 70]);

  myClass.data = [60, 70];
  print(myClass.currentData);

  print(myClass.getMultipliedData(3));
}
複製程式碼

當我們執行應用程式時,我們應該得到螢幕的輸出,就像螢幕下方的最終輸出一樣:

[70, 90]
[180, 210]
複製程式碼

下面是另一種模式。例如,您需要一個用於儲存請求正文的型別,該型別的鍵和值型別對於每種型別都可能不同。對於這種情況,Map <String,dynamic> data type 是合理的。儘管如此,每次您需要宣告一個請求主體變數時,您可以為該型別建立 typedef,而不是使用 Map <String,dynamic>

typedef RequestBody = Map<String, dynamic>;

void main() {
  final RequestBody requestBody1 = {
    'type': 'BUY',
    'itemId': 2,
    'amount': 200,
  };
  final RequestBody requestBody2 = {
    'type': 'CANCEL_BUY',
    'orderId': '04567835',
  };

  print(requestBody1);
  print(requestBody2);
}
複製程式碼

當我們執行應用程式時,我們應該得到螢幕的輸出,就像螢幕下方的最終輸出一樣:

{type: BUY, itemId: 2, amount: 200}
{type: CANCEL_BUY, orderId: 04567835}
複製程式碼

還可以定義具有泛型型別引數的型別別名。下面的 ValueList 型別別名有一個泛型型別引數 t。使用型別別名定義變數時,可以傳遞要使用的泛型型別。

類似地,您可以表示具有泛型型別引數的型別別名。下面的 NumberList 型別別名具有一個非獨佔型別引數 t。在利用型別別名對變數進行特徵化時,可以傳遞常規型別以進行利用。

typedef NumberList<T> = List<T>;

void main() {
  NumberList<String> numbers = ['1', '2', '3'];
  numbers.add('4');
  print('length: ${numbers.length}');
  print('numbers: $numbers');
  print('type: ${numbers.runtimeType}');
}
複製程式碼

當我們執行應用程式時,我們應該得到螢幕的輸出,就像螢幕下方的最終輸出一樣:

length: 4
numbers: [1, 2, 3, 4]
type: List<String>
複製程式碼

Usage in Flutter

下面的程式碼是一個 Flutter 模型,它為 List <widget> 型別定義了 typedef。

import 'package:flutter/material.dart';

typedef WidgetList = List<Widget>;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: TypedefExample(),
      debugShowCheckedModeBanner: false,
    );
  }
}

class TypedefExample extends StatelessWidget {

  WidgetList buildMethod() {
    return <Widget>[
      const FlutterLogo(size: 60),
      const Text('FlutterDevs.com', style: const TextStyle(color:  Colors.blue, fontSize: 24)),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Demo'),
      ),
      body: SizedBox(
        width: double.infinity,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: buildMethod(),
        ),
      ),
    );
  }
}
複製程式碼

Conclusion

在這篇文章中,我解釋了在 Dart & Fluter 中 TypeDef 的基本結構,您可以根據自己的選擇修改這個程式碼。這是一個小型介紹 TypeDef 在 Dart 和 Fluter 對使用者互動從我這邊,它的工作使用 Flutter。

我希望這個部落格能夠為你提供足夠的資訊,幫助你在你的專案中嘗試使用 TypeDef In Dart & Fluter。這就是如何製作和利用 Dart/Flutter 中的 typedef。您需要允許 typedef 的型別或函式簽名。然後,在這一點上,可以將所生成的 typedef 用作策略的變數、欄位、引數或返回值。所以請嘗試一下。


© 貓哥

ducafecat.tech/

github.com/ducafecat

往期

開源

GetX Quick Start

github.com/ducafecat/g…

新聞客戶端

github.com/ducafecat/f…

strapi 手冊譯文

getstrapi.cn

微信討論群 ducafecat

系列集合

譯文

ducafecat.tech/categories/…

開源專案

ducafecat.tech/categories/…

Dart 程式語言基礎

space.bilibili.com/404904528/c…

Flutter 零基礎入門

space.bilibili.com/404904528/c…

Flutter 實戰從零開始 新聞客戶端

space.bilibili.com/404904528/c…

Flutter 元件開發

space.bilibili.com/404904528/c…

Flutter Bloc

space.bilibili.com/404904528/c…

Flutter Getx4

space.bilibili.com/404904528/c…

Docker Yapi

space.bilibili.com/404904528/c…

相關文章