簡體   English   中英

使用帶有 flutter_bloc 的 Equatable 類

[英]using Equatable class with flutter_bloc

為什么當我們需要使用帶有 flutter_bloc 的 Equatable 類時? ,還有我們需要的道具呢? 這是在顫振中以塊模式創建狀態的示例代碼,我需要一個詳細的答案。 先感謝您

abstract class LoginStates extends Equatable{}

class LoginInitialState extends LoginStates{
  @override
  List<Object> get props => [];

}

我們正在使用 Equatable 包,以便我們可以比較類的實例,而無需手動覆蓋“==”和 hashCode。

Equatable 類允許我們比較兩個對象是否相等。

這是一個等價的例子。 假設我們有以下類:

class Person {
  final String name;

  const Person(this.name);
}

我們可以像這樣創建 Person 的實例:

void main() {
  final Person bob = Person("Bob");
}

稍后,如果我們嘗試在生產代碼或測試中比較 Person 的兩個實例,我們將遇到問題。

print(bob == Person("Bob")); // false

為了能夠比較 Person 的兩個實例,我們需要更改我們的類以覆蓋 == 和 hashCode ,如下所示:

class Person {
  final String name;

  const Person(this.name);

  @override
  bool operator ==(Object other) =>
    identical(this, other) ||
    other is Person &&
    runtimeType == other.runtimeType &&
    name == other.name;

  @override
  int get hashCode => name.hashCode;
}

現在,如果我們再次運行以下代碼:

print(bob == Person("Bob")); // true

它將能夠比較 Person 的不同實例。

因此,當覆蓋“==”和 hashCode 時,您不必浪費時間編寫大量樣板代碼。

使用 Equatable 之類的

class Person extends Equatable

在集體案件中; 如果您嘗試使用具有可變狀態的 bloc,您將面臨沒有 Equatable 的問題。 它使資源不可變降低性能。 創建副本比改變屬性更昂貴。

如果您不清楚我試圖解釋的內容,閱讀本文可能會對您有所幫助。

為了比較數據,我們需要Equatable 它在內部覆蓋了==hashCode ,從而節省了大量樣板代碼。 Bloc ,我們必須將Equatable擴展到狀態States and Events類才能使用此功能。

 abstract class LoginStates extends Equatable{}

因此,這意味着LoginStates不會重復調用並且不會在出現相同狀態時重建小部件。

定義狀態:

class LoginInitialState extends LoginStates {}

使用 props 定義 State:

props聲明時,我們希望State進行比較反對,宣布里面的值道具列表

class LoginData extends LoginStates {
  final bool status;
  final String userName;
  const LoginData({this.status, this.userName});
  @override
  List<Object> get props => [this.status, this.userName];
}

如果我們從列表中刪除用戶名並保留一個類似[this.status]的列表,那么State將只考慮status字段,避免username [this.status]段。 這就是我們使用 props 來處理 State 變化的原因。

塊流用法:

當我們State with Equatable擴展State with Equatable ,可以將舊狀態數據與新狀態數據進行比較。 作為一個例子,讓我們看看下面的例子,LoginData 將只構建一次小部件,這將避免第二次調用,因為它是重復的。

@override
Stream<LoginStates> mapEventToState(MyEvent event) async* {
  yield LoginData(true, 'Hello User');
  yield LoginData(true, 'Hello User'); // This will be avoided
}

詳細博客: https : //medium.com/flutterworld/flutter-equatable-its-use-inside-bloc-7d14f3b5479b

Equatable為您覆蓋 == 和hashCode ,因此您不必浪費時間編寫大量樣板代碼。

還有其他包實際上會為您生成樣板; 但是,您仍然必須運行不理想的代碼生成步驟。

使用Equatable ,無需生成代碼,我們可以將更多精力放在編寫出色的應用程序上,而不是放在平凡的任務上。 propsequatablegetter ,它接受我們想要的屬性
雖然它不需要關注它,但我只是將屬性放到了 props getter 上,這並不重要,但我建議你在這里閱讀更多關於它的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM