【发布时间】:2021-01-31 14:08:18
【问题描述】:
我已经开始使用 Flutter 进行开发。在一种情况下,我必须检查用户是否连接到互联网。我正在使用connectivity 0.4.9+5 和data_connection_checker 0.3.4 组合来检查用户是否有活动连接。
我已经创建了一个文件 internet_connectivity_service.dart 来执行所有相关的任务。
class InternetConnectivityService {
StreamSubscription<ConnectivityResult> _subscription;
/*
* This function check if the device has internet connectivity.
* With the help of DataConnectionChecker it checks for actual internet connectivity.
*/
Future<bool> _checkConnectivity() async {
if (await DataConnectionChecker().hasConnection) {
return true;
} else {
return false;
}
}
/*
* This function is invoked to on each connection change request.
* Using Connectivity package it will check for connectivity and connection type.
* This function has return type of Future<bool> which perform async request to check connectivity.
* After checking connection type it check for divice has internet accesssible or not.
*/
Future<bool> _hasInternet() async {
var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
return _checkConnectivity();
} else if (connectivityResult == ConnectivityResult.wifi) {
return _checkConnectivity();
} else {
return false;
}
}
StreamSubscription<ConnectivityResult> initInterNetConnectivitySubscription(
BuildContext context) {
// * Subscribe to connectivity changes
_subscription = Connectivity().onConnectivityChanged.listen(
(ConnectivityResult result) {
_hasInternet().then(
(result) {
// * When internet is disconnected
Size size = MediaQuery.of(context).size;
if (!result) {
Scaffold.of(context).showSnackBar(
snackBarBuilder(
color: kErrorColor,
text: 'Connection Lost',
context: context),
);
} else {
Scaffold.of(context).showSnackBar(
snackBarBuilder(
color: kSuccessColor, text: 'Connected', context: context),
);
}
},
);
},
);
return _subscription;
}
disposeSubscription() {
_subscription.cancel();
}
}
函数initInterNetConnectivitySubscription 和disposeSubscription 用于订阅和取消订阅特定事件。我正在从我想要此功能的组件中调用这些方法。
例如:
InternetConnectivityService internetConnectivityService =
InternetConnectivityService();
@override
initState() {
internetConnectivityService.initInterNetConnectivitySubscription(context);
super.initState();
}
@override
dispose() {
internetConnectivityService.disposeSubscription();
super.dispose();
}
通过这样做,有时功能可以正常工作,但有时我会遇到错误,指出 E/EventChannel#plugins.flutter.io/connectivity_status(28677): Failed to close existing event stream。
完整的堆栈跟踪。
Restarted application in 5,259ms.
E/EventChannel#plugins.flutter.io/connectivity_status(28677): Failed to close existing event stream
E/EventChannel#plugins.flutter.io/connectivity_status(28677): java.lang.IllegalArgumentException: NetworkCallback was not registered
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at com.android.internal.util.Preconditions.checkArgument(Preconditions.java:50)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at android.net.ConnectivityManager.unregisterNetworkCallback(ConnectivityManager.java:4009)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at io.flutter.plugins.connectivity.ConnectivityBroadcastReceiver.onCancel(ConnectivityBroadcastReceiver.java:53)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler.onListen(EventChannel.java:182)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler.onMessage(EventChannel.java:167)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at android.os.MessageQueue.nativePollOnce(Native Method)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at android.os.MessageQueue.next(MessageQueue.java:336)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at android.os.Looper.loop(Looper.java:174)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at android.app.ActivityThread.main(ActivityThread.java:7356)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at java.lang.reflect.Method.invoke(Native Method)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
E/EventChannel#plugins.flutter.io/connectivity_status(28677): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)**strong text**
由于此错误,我的应用程序没有崩溃,但有时功能无法按预期工作。请让我知道我是否犯了一些错误,或者他们是否是这样做的更好方法。我只是不想拥有当用户没有连接时应用程序会显示您没有连接到互联网的功能。
【问题讨论】:
-
我在这里收到了同样的错误,但只是通过使用连接包。每次我热重启应用程序时,都会弹出这个错误并将事情搞砸。厌倦了 Flutter 团队开发官方插件的方式。这纯粹是对我们的不尊重。
-
我也遇到了同样的问题,如果有人有解决方案最好分享一下。
-
这里也一样。提供程序停止正常运行。
-
这里有同样的问题。有什么更新吗?