![](/img/trans.png)
[英]How To Get My Deeply Nested Data To Update Properly When Using Flutter_bloc 8.0.0+ And 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.