簡體   English   中英

Flutter Bloc 與“InProgress”的提供者狀態管理

[英]Flutter Bloc vs Provider State Manament for "InProgress"

我可以通過Flutter Bloc 中的“yield”操作符管理 InProgress 狀態,

我的集團:

@override
  Stream<ContentState> mapEventToState(
    ContentEvent event,
  ) async* {
    if (event is ContentStarted) {
      yield ContentLoadInProgress(); //yeah
      var content= await repository.getContent();
      yield ContentLoadSuccess(content);
    }
    ...
 }

頁:

      builder: (context, state) {
         if (state is ContentInProgress) {
          return LoadingWidget();         //showing CircularProgressIndicator Widget
        } else if (state is ContentLoadSuccess) {
         return Text(state.content); 
         }

(狀態:InitState、ContentLoadInProgress、ContentLoadSuccess、ContentLoadFailure)

如何在Provider State Management 中管理“ContentLoadInProgress”狀態?

您可以將狀態保留為enum

enum ContentStates { 
  InitState, 
  ContentLoadInProgress, 
  ContentLoadSuccess, 
  ContentLoadFailure,
}

在您的提供者類中:

class ContentProvider with ChangeNotifier {
  ContentState state = ContentStates.InitState;
  Content content;

  yourEvent() {
    state = ContentStates.ContentLoadInProgress;
    notifyListeners(); // This will notify your listeners to update ui

    yourOperations();
    updateYourContent();
    state = ContentStates.ContentLoadSuccess;
    notifyListeners();
  } 
}

在您的小部件中,您可以使用Consumer (假設您已經在小部件樹中使用了上面的ChangeNotifierProvider

Consumer(
  builder: (context, ContentProvider provider, _) {
    if (provider.state == ContentStates.ContentLoadInProgress) {
      return LoadingWidget();
    } else if (provider.state == ContentStates.ContentLoadSucces) {
      // use provider.content to get your content
      return correspondingWidget();
    } else if .... // widgets for other states
  }
)

暫無
暫無

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

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