互联网连接混乱

问题描述

如何对整个应用程序一次只进行一次连续的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');
    }
  }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...