你好,我正在使用RiverPod来判断整个应用程序的互联网连接,但是状态通知程序只给出了初始状态值,或者我应该看到它的值没有改变. 还有,是的,我正在更新状态,你可以在代码中看到它.

InternetProvider.dart:

import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart';
import 'package:riverpod/riverpod.dart';

class ConnectivityStatusNotifier extends StateNotifier<bool> {
  ConnectivityStatusNotifier() : super(false);

  void checkInternet() {
    final listener =
        InternetConnection().onStatusChange.listen((InternetStatus status) {
      if (status == InternetStatus.connected) {
        state = true;
      }
      else{
        state = false;
      }
    });
  }
}

final connectivityProvider =
    StateNotifierProvider<ConnectivityStatusNotifier, bool>((ref) {
  return ConnectivityStatusNotifier();
});

In HomeScreen.dart:

final internet = ref.watch(connectivityProvider);

final Widget floatingActionButton = FloatingActionButton(
      onPressed: () {
        print(internet);
      },
      child: const Icon(Icons.chat),
    );

Output

无论互联网是否连接,它总是错误的

我也try 过Connectivity_plus程序包,但也不起作用. 我也试过这个:medium.com这个也不起作用,这个也提供了初始状态,即ConnectivityStatus.Connected.

推荐答案

First of all,在使用internet_connection_checker_plus套餐时,需要给平台权限:

->Android

将以下权限添加到您的AndroidManifest.xml文件:

<uses-permission android:name="android.permission.INTERNET" />

->;MacOS

将以下权限添加到您的MacOS .entitlements文件:

<key>com.apple.security.network.client</key>
<true/>

Then我稍微重新考虑了一下您的代码,并编写了另一个代码,更具react 性,使用Notifier而不是遗留的StateNotifier:

final connectivityProvider = NotifierProvider<ConnectivityStatusNotifier, bool>(
  ConnectivityStatusNotifier.new,
);

class ConnectivityStatusNotifier extends Notifier<bool> {
  late InternetConnection _internetConnection;

  @override
  bool build() {
    _internetConnection = InternetConnection();
    final stream = _internetConnection.onStatusChange.listen(_statusListener);

    ref.onDispose(() {
      stream.cancel();
    });

    return false;
  }

  void _statusListener(InternetStatus status) {
    switch (status) {
      case InternetStatus.connected:
        state = true;
      case InternetStatus.disconnected:
        state = false;
    }
  }
}

现在您可以在界面上做一些事情,只需将connectivityProvider更改为listen即可.如果需要,您可以在零食中添加一个动作按钮:

class MyApp extends ConsumerWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    ref.listen(connectivityProvider, (_, isConnected) {
      if (!isConnected) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text('No internet connection')),
        );
      }
    });

    return const Text('Next are other widgets');
  }
}

当你拨打checkInternet的时候,in your code不是很清楚.问题是,如果您多次调用它而没有取消上一次订阅,您将获得一个小的内存泄漏:)我假设您可能完全忘记了调用此函数)

Flutter相关问答推荐

ListTile未正确显示在flutter中

自定义ItemBuilderFlutter

Android上火焰瓷砖之间的线条飘动

我想创建一个可滚动的堆叠列表项,每个项都朝向屏幕

Flutter :URI的目标不存在

Android工作室Flutter 热重新加载更新后不工作

从图标启动器打开时,VSCode未检测到Web设备

Flutter 使用扩展的 TextField 定位小部件

如何在 flutter 中使用带有有效负载数据的重定向来执行 firebase 推送通知.?

我可以定义一次 sharedPreferences 并在需要数据显示到 flutter 应用程序时调用它吗?

如何从 Flutter Slider Widget 中移除发光效果?

Firebase 中的查询限制 - .orderBy() 错误

仅使用 Flutter 在本地环境中托管 Web 服务器

配置项目:firebase_core时出现问题

如何防止卡子在底部溢出?

如何让多个图标转到不同的网址

我几乎每次都将 Stateless Widget 与 BLoC 一起使用.我错了吗?

我想在数组中添加项目

Flutter:如何将列表转换为字符串?

Flutter 小部件中的视图和逻辑分离