问题描述
如何对整个应用程序一次只进行一次连续的Internet连接检查,我已经完成了几乎完整的应用程序,现在我需要添加Internet连接检查,请帮助,在此先感谢
@override
Widget build(BuildContext context) {
return StreamBuilder<ConnectivityResult>(
stream: connectivityStream,builder: (context,snapshot) {
if (snapshot.hasData) {
final connectivityResult = snapshot.data;
if (connectivityResult == ConnectivityResult.none) {
return MaterialApp(
debugShowCheckedModeBanner: false,home: NoInternetConnectionScreen(),);
}
return MaterialApp(
debugShowCheckedModeBanner: false,home: SplashScreen(),routes: routes,);
} else if (snapshot.hasError) {
return MaterialApp(
debugShowCheckedModeBanner: false,);
}
return Center(child: CircularProgressIndicator());
}
);
}
解决方法
连通性插件在其文档中指出,仅在存在网络连接时提供信息,而在网络连接到Internet时不提供信息
请注意,在Android上,这不保证可以连接到Internet。 例如,该应用程序可能具有wifi访问权限,但可能是VPN或 无法访问的酒店WiFi。
您可以使用
import 'dart:io';
...
try {
final result = await InternetAddress.lookup('google.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
print('connected');
}
} on SocketException catch (_) {
print('not connected');
}
,
我认为最佳实践是使用连接插件并将您的应用包装在流构建器中
https://pub.dev/packages/connectivity
您的主屏幕/主页应该是这样的:
class MainScreen extends StatelessWidget {
Stream connectivityStream = Connectivity().onConnectivityChanged;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppStyle.backgroundColor,body: StreamBuilder<ConnectivityResult>(
stream: connectivityStream,builder: (context,snapshot) {
if (snapshot.hasData) {
final connectivityResult = snapshot.data;
if (connectivityResult == ConnectivityResult.none) {
return NoConnectionPage();
}
return HomePage();
} else if (snapshot.hasError) {
return NoConnectionPage();
// or some error page,but I think no connection page is what you
// want here
}
return Center(child: CircularProgressIndicator());
}
)
);
}
}
在NoConnectionPage()中,您可以具有一个按钮,该按钮使用以下方法重试连接:
void _retryConnection() async {
try {
final result = await InternetAddress.lookup('example.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
print('connected');
Navigator.of(context).pop(); // going back to MainScreen()
}
} on SocketException catch (_) {
print('not connected');
}
}