简体   繁体   English

检查颤振上的互联网连接时出现问题

[英]Problem while checking internet connectivity on flutter

I was trying to check the internet connection on my flutter app with the help of connectivity plus package and a function which I saw in one of the answers of stackoverflaw.我试图在连接加包和我在 stackoverflaw 的一个答案中看到的一个功能的帮助下检查我的 flutter 应用程序上的互联网连接。 Below is the code:下面是代码:

connectivity_check.dart连通性_check.dart

import 'dart:async';
import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';

enum ConnectivityStatus { Online, Offline }

class ConnectivityService {
  // Create our public controller
  StreamController<ConnectivityStatus> connectionStatusController =
      StreamController<ConnectivityStatus>();
  final _connectivity = Connectivity();
  ConnectivityService() {
    // Subscribe to the connectivity Chanaged Steam

    _connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
      _checkStatus(result);
    });

  void _checkStatus(ConnectivityResult result) async {
    bool isOnline = false;
    try {
      final result = await InternetAddress.lookup('example.com');
      isOnline = result.isNotEmpty && result[0].rawAddress.isNotEmpty;
      print(isOnline);
    } on SocketException catch (_) {
      isOnline = false;
    }
    if (isOnline == true)
      connectionStatusController.sink.add(ConnectivityStatus.Online);
    else
      connectionStatusController.sink.add(ConnectivityStatus.Offline);
  }

  void disposeStream() => connectionStatusController.close();
}

StreamProvider in main.dart main.dart 中的 StreamProvider

StreamProvider<ConnectivityStatus>(
            initialData: ConnectivityStatus.Online,
            create: (_) =>
                ConnectivityService().connectionStatusController.stream)

The Widget where I am using this connectivity provider我在其中使用此连接提供程序的小部件

class OfferPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: (Provider.of<ConnectivityStatus>(context) ==
              ConnectivityStatus.Online)
          ? ListView(
              children: [
                OfferImage(image: 'offer_banner.jpg'),
                OfferImage(image: 'offer1.jpg'),
                OfferImage(image: 'offer2.jpg'),
              ],
            )
          : Text('ok'),
    );
  }
}

The problem which I am facing is that the isOnline is always returning true even if I switch off my Wifi/data.我面临的问题是,即使我关闭了 Wifi/数据,isOnline 也总是返回 true。 Whenever stream provider listens to change in network, it returns true/Online, it doesn't return false/Offline.每当流提供程序侦听网络中的变化时,它都会返回 true/Online,它不会返回 false/Offline。 Can someone help and debug the code?有人可以帮助和调试代码吗?

Avoid _checkStatus call which used InternetAddress.lookup , as we already have ConnectivityResult , its better to use that only.避免使用InternetAddress.lookup _checkStatus 调用,因为我们已经有了ConnectivityResult ,最好只使用它。

Package( https://pub.dev/packages/connectivity/install ):包( https://pub.dev/packages/connectivity/install ):

connectivity: ^3.0.6 

Connectivity.dart连通性.dart

import 'dart:async';

import 'package:connectivity/connectivity.dart';

class ConnectivityService {
  ConnectivityService() {
    Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
      connectionController.add(_getStatus(result));
    });
  }

  StreamController<ConnectivityStatus> connectionController =
      StreamController<ConnectivityStatus>();

  ConnectivityStatus _getStatus(ConnectivityResult result) {
    switch (result) {
      case ConnectivityResult.wifi:
        return ConnectivityStatus.Online;
      case ConnectivityResult.mobile:
        return ConnectivityStatus.Online;
      case ConnectivityResult.none:
        return ConnectivityStatus.Offline;
      default:
        return ConnectivityStatus.Online;
    }
  }
}

enum ConnectivityStatus { Online, Offline }

Register Provider:注册提供商:

StreamProvider<ConnectivityStatus>(
                        create: (context) => ConnectivityService().connectionController.stream),

Usage:用法:

 var connectionStatus = Provider.of<ConnectivityStatus>(context);
    if (connectionStatus == ConnectivityStatus.Online) {
      /// Online logic
    } else {
     /// Offline logic
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM