Как обработать потерянное соединение в приложении Flutter + Redux
У меня есть приложение flupper + redux, и я хочу определить, когда связь исчезла, и отобразить экран ожидания. Я подписал MyApp на свойство в моем штате под названием state.haveInternet с идеей перестроить все приложение при изменении state.haveInternet. Проблема в том, что мое приложение не отображает NoInternetScreen при изменении состояния. Что я делаю не так?
Я думаю, что с Navigator можно поиграть в другой подход, но я не уверен, где его использовать. Внутри промежуточного программного обеспечения (пахнет)? На самом деле, я добавляю слушателя в ConnectivityMidleware. Должен ли я переместить эту промежуточную программу в main() перед runApp()?
void main() {
Store<AppState> store = Store(
Reducers.root,
initialState: AppState.initial(),
middleware: [
LoggingMiddleware.printer(),
firebaseAuthMiddleware,
firebaseDatabaseMiddleware,
firebaseMessagingMiddleware,
connectivityMiddleware,
],
);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) {
runApp(new MyApp(store));
});
}
class MyApp extends StatelessWidget {
Store<AppState> store;
MyApp(this.store);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
FirebaseAnalytics analytics = FirebaseAnalytics();
return new StoreProvider(
store: store,
child: StoreConnector<AppState, Map>(
converter: (store) {
Map _viewmodel = {};
Map<String, double> media =
calculaMedia(List.of(store.state.registros.values), 10);
_viewmodel['mainColor'] = getColorByTension(
media['alta'].round(), media['baja'].round());
if (media['alta'] == 0.0 || media['baja'] == 0) {
_viewmodel['mainColor'] = Colors.red;
}
_viewmodel['haveInternet'] = store.state.haveConnectivity;
return _viewmodel;
},
builder: (context, viewmodel) => MaterialApp(
onGenerateTitle: (context) => AppLocalizations.of(context).title,
theme: new ThemeData(
primarySwatch: viewmodel['mainColor'],
),
home: viewmodel['haveInternet'] ? SplashScreen(store): NoInternetScreen(),
localizationsDelegates: [
const AppLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('es', 'ES'), // Spanish
// ... other locales the app supports
],
navigatorObservers: [
FirebaseAnalyticsObserver(analytics: analytics),
],
),
),
);
}
}
1 ответ
Вы можете использовать этот простой метод, чтобы узнать, подключен ли пользователь к Интернету или нет.
//Use dart.io for lookup method.
import 'dart:io';
Future<bool> _checkConnectivity() async {
bool connect;
try {
final result = await InternetAddress.lookup('google.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
connect = true;
}
} on SocketException catch (_) {
connect = false;
}
return connect;
}
теперь вы можете легко использовать этот метод, где бы вы ни захотели, он возвращает будущее.