From 64fa91647a779991c804f1a8738713e7b52ea8d7 Mon Sep 17 00:00:00 2001 From: AlexVincent525 Date: Wed, 19 Feb 2020 17:58:18 +0800 Subject: [PATCH] :sparkles: Add none connectivity dialog. --- lib/constants/instances.dart | 2 + lib/main.dart | 79 +++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/lib/constants/instances.dart b/lib/constants/instances.dart index c8669040..4bf7fa66 100644 --- a/lib/constants/instances.dart +++ b/lib/constants/instances.dart @@ -1,6 +1,7 @@ import 'dart:math' as math; import 'package:flutter/material.dart'; +import 'package:connectivity/connectivity.dart'; import 'package:event_bus/event_bus.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; @@ -22,6 +23,7 @@ class Instances { static final EventBus eventBus = EventBus(); static final navigatorKey = GlobalKey(); static AppLifecycleState appLifeCycleState = AppLifecycleState.resumed; + static ConnectivityResult connectivityResult; static final appsPageStateKey = GlobalKey(); static final courseSchedulePageStateKey = GlobalKey(); diff --git a/lib/main.dart b/lib/main.dart index 9733b02c..05736a8f 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,11 @@ +import 'dart:async'; import 'dart:io'; +import 'dart:ui' as ui; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:connectivity/connectivity.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -48,23 +51,30 @@ class OpenJMUApp extends StatefulWidget { } class OpenJMUAppState extends State with WidgetsBindingObserver { - final connectivitySubscription = Connectivity().onConnectivityChanged.listen( - (ConnectivityResult result) { - Instances.eventBus.fire(ConnectivityChangeEvent(result)); - debugPrint('Current connectivity: $result'); - }, - ); + StreamSubscription connectivitySubscription; int initAction; Brightness get _platformBrightness => Screens.mediaQuery.platformBrightness ?? Brightness.light; + ToastFuture connectivityToastFuture; + @override void initState() { debugPrint('Current platform is: ${Platform.operatingSystem}'); WidgetsBinding.instance.addObserver(this); tryRecoverLoginInfo(); + Connectivity().checkConnectivity().then(checkIfNoConnectivity); + connectivitySubscription = Connectivity().onConnectivityChanged.listen( + (ConnectivityResult result) { + checkIfNoConnectivity(result); + Instances.eventBus.fire(ConnectivityChangeEvent(result)); + Instances.connectivityResult = result; + debugPrint('Current connectivity: $result'); + }, + ); + Instances.eventBus ..on().listen((event) { if (!currentUser.isTeacher) { @@ -159,6 +169,63 @@ class OpenJMUAppState extends State with WidgetsBindingObserver { )); } + void checkIfNoConnectivity(ConnectivityResult result) { + if (result == ConnectivityResult.none) { + if (mounted) { + connectivityToastFuture = showToastWidget( + noConnectivityWidget, + duration: 999.weeks, + handleTouch: true, + ); + } else { + SchedulerBinding.instance.addPostFrameCallback((_) { + connectivityToastFuture = showToastWidget( + noConnectivityWidget, + duration: 999.weeks, + handleTouch: true, + ); + }); + } + } else { + if (Instances.connectivityResult == ConnectivityResult.none) { + connectivityToastFuture?.dismiss(showAnim: true); + } + } + } + + Widget get noConnectivityWidget => Material( + color: Colors.black26, + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 2.0, sigmaY: 2.0), + child: Center( + child: Container( + width: Screens.width / 2, + height: Screens.width / 2, + padding: EdgeInsets.all(20.0), + decoration: BoxDecoration( + color: Theme.of(context).canvasColor, + shape: BoxShape.circle, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.router, + size: Screens.width / 6, + color: Theme.of(context).iconTheme.color, + ), + SizedBox(height: Screens.width / 20), + Text( + '检查网络连接', + style: Theme.of(context).textTheme.body1.copyWith(fontSize: 20.0), + ), + ], + ), + ), + ), + ), + ); + @override Widget build(BuildContext context) { return MultiProvider(