簡體   English   中英

Flutter bloc 用數據填充初始狀態

[英]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.

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