Как убедиться, что соединение доступно с локальным сервером, прежде чем перейти к следующему экрану с BLoC patren

#flutter #flutter-bloc

Вопрос:

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

Первая страница, на которой отображается время запуска приложения, содержит текстовое поле, в котором пользователь должен будет заполнить IP-адрес сервера, на котором размещен сервер.

В случае успешного подключения пользователь будет перенаправлен на домашнюю страницу. Другое требование заключается в том, что пользователь должен ввести IP-адрес один раз, а затем, когда они снова запустят приложение, они должны быть перенаправлены непосредственно на домашнюю страницу, если есть успешное соединение с ранее предоставленным IP-адресом (возможно, во время загрузки может отображаться заставка.).

Я пытаюсь достичь всего этого, используя шаблон блока.

У меня есть класс ConnectionCubit, у которого есть следующий метод:

 Future<void> checkConnection(String? ipAddress) async {
    if (ipAddress == null || ipAddress.isEmpty) return;

    emit(state.copyWith(status: ConnectionStatus.loading));

    try {
      final result = await InternetAddress.lookup(ipAddress);

      if (result.isNotEmpty amp;amp; result[0].rawAddress.isNotEmpty) {
        emit(state.copyWith(status: ConnectionStatus.success));
      } else {
        emit(state.copyWith(status: ConnectionStatus.failure));
      }
    } on Exception {
      emit(state.copyWith(status: ConnectionStatus.failure));
    }
  }
 

Класс ConnectionState предоставляет только перечисление ConnectionStatus.

 enum ConnectionStatus { initial, loading, success, failure }
 

Домашний виджет приложения MaterialApp выглядит следующим образом:

 StreamBuilder<String?>(
          stream:
              RxSharedPreferences.getInstance().getStringStream('ipAddress'),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              context.read<ConnectionCubit>().checkConnection(snapshot.data);
              return BlocBuilder<ConnectionCubit, connection.ConnectionState>(
                  builder: (context, state) {
                if (state.status.isSuccess) {
                  return const Text('Login Page');
                } else if (state.status.isLoading) {
                  return const SplashPage();
                } else {
                  return const ConnectionPage();
                }
              });
            } else {
              return const ConnectionPage();
            }
          }),
 

В основном, когда пользователь заполняет форму и нажимает кнопку Подключения, IP-адрес сохраняется с помощью пакета rx_shared_preferences.

Когда пользователь запускает приложение, есть StreamBuilder, который проверяет, предоставил ли пользователь ранее IP-адрес, если это так, вызывается метод TestConnection с указанным IP-адресом. В случае успешного подключения пользователь перенаправляется на домашнюю страницу, в противном случае он перенаправляется на страницу, где должен быть указан IP-адрес. Если IP-адрес не был указан, пользователь снова перенаправляется на страницу, где он должен ввести IP-адрес.

All of this works for now but I’m new to flutter and I’m here to ask if there is a better way to achieve this because I’m not sure if a BlocBuilder inside a StreamBuilder is a good idea. And honestly the solution I came up with looks like way too much spaghetti code to me.

Thanks for your time all recommendations are appreciated!