#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!