Flutter:connectivity_plus监听网络变化

839 阅读1分钟

还是先说问题👇

场景一:ios在首次安装app时会弹框提示用户是否授权网络,在用户没有授权之前,掉的接口都是失败的。这里会出现一个时间差,如果app没有做网络监听就会出现页面白屏的情况。所以需要监听网络变化(在此说明,我查阅了ios相关文档,用户点击操作之后是没有回调供开发者使用),状态从没有网络=》wifi/蜂窝的转变时重新掉接口刷新页面。

综上所述,我们要监听网络变化😭!但是我们有大佬前辈写的插件可以让我们看!!!! connectivity_plus

image.png

Connectivity提供了一个onConnectivityChanged的方法去实现网络监听,checkConnectivity支持查询当前网络状态

解决方案:目前我支持的这个项目单纯的在首页监听网络变化,还是会出现接口调用失败的情况。在和产品沟通过后,我把网络判断直接放在开屏页之前,在用户没有点击授权网络之前就一直停留在开屏页,并提示用户去设置里开启网络授权。

import 'package:connectivity_plus/connectivity_plus.dart';

//onInit`里添加网络监听
state.connectivitySubscription = Connectivity().onConnectivityChanged.listen(updateConnectionStatus);

//onClose里移除监听
state.connectivitySubscription.cancel();

//在获取接口之前根据ConnectivityResult来判断,是否有网络
Future<void> updateConnectionStatus(ConnectivityResult result) async {
    if (result != ConnectivityResult.none) {
      //设置国家语言
      await getCountryAndLanguage(null);
      await getHomeAdvertiseList();
    }
  }

场景二:商品详情页,要给用户省流量。在非wifi网络下,视频不会自动播放。

如果不需要监听网络变化,只是需要获取当前是wifi还是移动网络

import 'package:connectivity_plus/connectivity_plus.dart';

Connectivity().checkConnectivity().then((connectivityResult) {
  if (connectivityResult == ConnectivityResult.mobile) {
    // I am connected to a mobile network.
  } else if (connectivityResult == ConnectivityResult.wifi) {
    // I am connected to a wifi network.
    state.chewieController?.setVolume(0);
    state.chewieController?.play();
  }
});