[英]Flutter bloc test -- emitsInorder does not emit the initial state
[英]Flutter bloc fill initial state with data
我有一個關於 bloc 正確代碼放置的問題,可以這么說。 因此,由於 bloc 代表業務邏輯組件,我將業務邏輯(如處理數據方法)移到了類中。 所以現在有兩種方法,一種用於獲取,第二種用於保存數據。 接下來,我有我的組件,它應該在AddInitial
顯示加載,然后觸發 bloc 說“嘿,我需要這里的數據”。 它是正確的還是反模式? 代碼看起來像這樣。
BlocBuilder<AddBloc, AddState>(
buildWhen: (previous, current) {
// code is ommited
},
builder: (context, state) {
if (state is ExpensesLoaded || state is CategoryChanged) {
// code is ommited
} else if (state is ExpensesLoading) {
return getProgressSpinner();
} else if (state is AddInitial) {
// is it ok? If it's antipattern please give an advise how to do it correctly
context.bloc<AddBloc>().add(CategoryChange([category]));
return getProgressSpinner();
} else {
print('Bloc Loaded. Nothing to show inside Month Expenses...');
return Container();
}
}
關於context.bloc<AddBloc>().add(CategoryChange([category]));
. 是反模式嗎? 這應該怎么做?
順便說一下,當它看起來像這樣。 下次當我將CategoryChange
事件添加到 bloc(這將產生CategoryChanged
狀態)時,上面的構建器由於某種原因沒有反應......
謝謝!
我正在使用 Flutter 1.22.3,flutter_bloc:6.1.0
這應該怎么做?
當您在創建 Bloc 時知道 Bloc 的初始狀態(假設是默認情況下預選第一個條目的靜態列表)時,您可以使用 Bloc 構造函數,該構造函數將該初始狀態作為參數。
如果您不知道正確的初始狀態是什么,因為它是動態的(假設從基於 GPS 的服務加載的位置列表,用戶必須同意通過單擊按鈕才能獲得,因為它會花錢)那么它是完美的可以有“空”或“未初始化”或“waitingForUserInteraction”狀態。 畢竟,這就是您的程序的狀態。
順便說一下,當它看起來像這樣。 下次當我將 CategoryChange 事件添加到 bloc(這將產生 CategoryChanged 狀態)時,上面的構建器由於某種原因沒有反應
塊通過比較舊狀態和新狀態來確定是否發送新狀態更改。 如果要修改默認行為,可以確保兩個狀態比較相等(或不相等)。 最簡單的方法是從Equatable
包中的Equatable導出狀態,如下所示:
@immutable
abstract class SomeState extends Equatable {
final String importantChange;
final String unimportantChange;
const SomeState(this.importantChange, this.unimportantChange);
@override
List<Object> get props => [importantChange];
}
在“props”列表中只列出一個字段意味着在比較相等性時只比較它。 如果importantChange
相等,則認為狀態相等(並且不會從 Bloc 發出)。 具有相同importantChange
但不同unimportantChange
兩個狀態被認為是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.