flutter_blo c общее состояние для многих блоков - PullRequest
0 голосов
/ 06 мая 2020

скажем, я хочу проверять соединение inte rnet каждый раз, когда я вызываю Api, если нет inte rnet вызова с исключением типа throw, например NoInternetException , а затем показывать экран состояния пользователю говорит ему проверить их соединение.

Как я могу добиться этого без создания нового состояния для каждого blo c в flutter_bloc библиотеке?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Вы можете сделать это в блоке c, который управляет вашими root страницами, такими как authentication_page и домашняя страница.

Создайте state для noConnectivity.

NoConnectivity extends AuthenticationState{
  final String message;

  const NoConnectivity({ this.message });

}

Теперь создайте event для noConnectivity.

NoConnectivityEvent extends AuthenticationEvent{}

Наконец, создайте StreamSubscription в своем AuthenticationBloc для непрерывного прослушивания изменений connecitvityState, и если состояние connectivity.none мы вызовем состояние NoConnecitivity.

class AuthenticationBloc
    extends Bloc<AuthenticationEvent, AuthenticationState> {

StreamSubscription subscription;

 @override
  AuthenticationState get initialState => initialState();

  @override
  Stream<AuthenticationState> mapEventToState(
    AuthenticationEvent event,
  ) async* {
    // ... all other state map
   else if(event is NoConnectivityEvent) {
     yield* _mapNoConnectivityEventToState();
   }


Stream<AuthenticationState> _mapNoConnectivityEventToState() async * {
     subscription?.cancel();

     //Edit to handle android internet connectivity.
      subscription = Connectivity()
                    .onConnectivityChanged
                    .listen((ConnectivityResult result) {
                         if(Platform.isAndroid) {
                              try {
                                     final lookupResult = InternetAddress.lookup('google.com');
                                     if (lookupResult.isNotEmpty && lookupResult[0].rawAddress.isNotEmpty) {
                                         print('connected');
                                    }
                                  } on SocketException catch (error) {
                                       return add(NoConnectivityState(message: error.message ));
                                  }
                          } else if(result == ConnectivityResult.none ) {
                            return add(NoConnectivityState(message: "Noconnection")) ;

                          }
                           print("Connected");

                    });
}

  @override
  Future<void> close() {
    subscription?.cancel();
    return super.close();
  }

}

Этот поток подписки будет вечно слушать no connection и sh соответствующую страницу, которая вам нравится в штате.

Необходимые пакеты

rxdart

подключение

Надеюсь, это поможет!

0 голосов
/ 09 мая 2020

вам нужен базовый класс blo c скажем его имя «BaseBlo c» , и он должен унаследовать от класса «Blo c» и реализовать метод «mapToStateEvent» для обработки » noInte rnet ", и после этого метода вызова назовем его имя" internalMapToStateEvent ", которое вы создали, этот метод переопределяет метод и унаследовал весь ваш класс blo c от « BaseBlo c » и вам нужно то же, что для страниц, чтобы рисовать один виджет "noInternetWidget"

...