在 BlocLibrary 的 ToDo 教程中,我沿用了以下片段。
TodosOverviewState copyWith({
TodosOverviewStatus Function()? status,
List<Todo> Function()? todos,
TodosViewFilter Function()? filter,
Todo? Function()? lastDeletedTodo,
}) {
return TodosOverviewState(
status: status != null ? status() : this.status,
todos: todos != null ? todos() : this.todos,
filter: filter != null ? filter() : this.filter,
lastDeletedTodo:
lastDeletedTodo != null ? lastDeletedTodo() : this.lastDeletedTodo,
);
}
這到底是做什么的,它是如何作業的?我知道,copyWith但我不明白.. Function()? ...。
我在 Google 上找到了另一個參考資料,其中指出它有助于克服null問題。但是為什么我需要Function,否則會發生什么?
=========================
更新:我不是在問 copyWith 有什么好處,只是為什么他們使用Function()?復制 astate和一個更簡單的構造來復制資料物件。該教程可以在這里找到。在那里,您將Function在“ToDosOverview”中找到 bloc 代碼,在“LocalStorageTodosApi”中的 ToDoModel 中找到更簡單的代碼
uj5u.com熱心網友回復:
copyWith(...) 函式是 Dart 中用于復制物件的唯一模式。在 Dart 中,物件沒有 C 中的復制建構式,您必須使用 copyWith(...) 來完成。此外,在視圖部分,無法修改狀態物件,因此您無法創建 setter 函式,修改狀態物件的唯一方法是復制它更改一個/多個專案。為什么這個?因為框架(顫振)必須通過更改物件(在內部使用boolean isDirty標志來決定是否/不重新繪制小部件)。如何意識到它?如果您將物件“掛鉤”到視圖(小部件),如何知道物件已更改?您有兩種情況:一,您測驗該物件中每個欄位的等效性(深度),或者:二,只需檢查新物件是否與以前相同(即:“指標”與前?)。以這種方式,Flutter 意識到重繪 Widget 的時間會大大減少。這就是為什么執行資料的物件都應該是“不可變的”以及為什么您將在任何地方使用 copyWith(...) 來更改它們(并更新視圖)。事實上,凍結的庫非常有用,因為您將擁有您的 copyWith(...) 而無需撰寫它(以及許多其他功能,如 Unions、json 序列化等...)
為什么欄位是函式?因為通過這種方式,您可以將欄位設定為空。例如,如果您想將TodosOverviewState 設定復制為 null 狀態,使用 copyWith 函式的“普通”實作,您不能:
`TodosOverviewState` copyWith({
TodosOverviewStatus? status,
List<Todo> ? todos,
TodosViewFilter ? filter,
Todo? lastDeletedTodo,
}) {
return TodosOverviewState(
status: status != null ? status: this.status,
todos: todos != null ? todos : this.todos,
filter: filter != null ? filter : this.filter,
lastDeletedTodo:
lastDeletedTodo != null ? lastDeletedTodo : this.lastDeletedTodo,
);
}
在 copyWith 的這個“普通”實作中,如果你做:
TodosOverviewState myObj = ... ;
var copied = myObj.copyWith(status : null );
您獲得該copied物件與 相同 myObj。
但是,使用這些函式,您會將狀態設定為 null 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/533166.html
標籤:扑镖班级颤振块
上一篇:如何在flutter中將EitherRight初始化為空值-重新加載
下一篇:如何相對調整影像小部件的大小?
