flutter_bloc разделяет состояние для многих блоков

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

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


person Wail Hayaly    schedule 06.05.2020    source источник


Ответы (2)


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

Создайте 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 и перемещать нужную страницу в состояние.

Обязательные пакеты

rxdart

возможность подключения

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

person Loïc Fonkam    schedule 08.05.2020
comment
Отличное объяснение! Но в пакете подключения указано в их репозитории: Обратите внимание, что на Android это не гарантирует подключение к Интернету. Например, у приложения может быть доступ к Wi-Fi, но это может быть VPN или Wi-Fi в отеле без доступа. Так что, не лучше ли проверять подключение каждый раз, когда я звоню из API? - person Wail Hayaly; 09.05.2020
comment
Удивительный !! Большое спасибо :) - person Wail Hayaly; 09.05.2020

вам нужен блок базового класса, скажем его имя «BaseBloc», и он должен унаследовать от класса «Bloc» и реализовать метод «mapToStateEvent» для обработки исключения «noInternet», а после этого метода вызова, скажем, его имя "internalMapToStateEvent" вы создали, этот метод переопределяет метод и унаследовал весь ваш класс блока от "BaseBloc", и вам нужно то же самое, что и для страниц, чтобы рисовать один виджет "noInternetWidget"

person farouk osama    schedule 08.05.2020