Flutter Bloc против управления состоянием провайдера для InProgress

Я могу управлять состоянием InProgress с помощью оператора «yield» в Flutter Bloc,

Мой блок:

@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)

Как я могу управлять состоянием «ContentLoadInProgress» в управлении состоянием поставщика?


person Adem Aygun    schedule 03.03.2020    source источник
comment
С логическим значением inProgress, для которого вы устанавливаете значение true, когда начинаете свою операцию, и возвращаете значение false, когда операция завершена.   -  person Ovidiu    schedule 03.03.2020


Ответы (1)


Вы можете сохранить свои состояния как 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
  }
)
person Selim Kundakçıoğlu    schedule 03.03.2020
comment
В этом примере не передается фактическое содержимое после успешной загрузки содержимого. Используются только перечисления. - person Satisfakshin; 08.12.2020