检查互联网MixinSkill asyncredux-check-internet-mixin

CheckInternet Mixin是Flutter/Dart开发中AsyncRedux库的一个混合类,用于在执行动作前验证设备互联网连接。它通过重写before()方法在无网络时抛出UserException触发错误对话框,支持自定义错误消息、无对话框处理(结合NoDialog)、静默中止(使用AbortWhenNoInternet)以及无限重试(UnlimitedRetryCheckInternet)等特性。适用于移动应用开发,确保网络依赖性操作的可靠性。关键词:Flutter开发, Dart编程, AsyncRedux, 网络连接检查, 移动应用, 错误处理, Mixin, 网络验证。

移动开发 0 次安装 0 次浏览 更新于 3/19/2026

name: asyncredux-check-internet-mixin description: 添加CheckInternet mixin以确保在执行动作前检查网络连接。覆盖自动错误对话框、与NoDialog结合用于自定义UI处理,以及AbortWhenNoInternet用于静默中止。

CheckInternet Mixin

CheckInternet mixin在执行动作前验证设备互联网连接。如果无网络连接,动作中止并显示对话框,消息为:“无互联网连接。请检查您的连接。”

基本用法

class LoadText extends AppAction with CheckInternet {

  Future<AppState?> reduce() async {
    var response = await http.get('https://api.example.com/text');
    return state.copy(text: response.body);
  }
}

该mixin通过重写before()方法工作。如果设备无连接,它抛出UserException,触发标准错误对话框。

自定义错误消息

重写connectionException()以返回自定义UserException

class LoadText extends AppAction with CheckInternet {

  @override
  UserException connectionException(UserException error) {
    return UserException('无法加载数据。请检查连接。');
  }

  Future<AppState?> reduce() async {
    var response = await http.get('https://api.example.com/text');
    return state.copy(text: response.body);
  }
}

NoDialog 修饰符

CheckInternet一起使用NoDialog以抑制自动错误对话框。这允许您在widget中使用isFailed()exceptionFor()处理连接失败:

class LoadText extends AppAction with CheckInternet, NoDialog {

  Future<AppState?> reduce() async {
    var response = await http.get('https://api.example.com/text');
    return state.copy(text: response.body);
  }
}

然后在widget中处理错误:

Widget build(BuildContext context) {
  if (context.isWaiting(LoadText)) {
    return CircularProgressIndicator();
  }

  if (context.isFailed(LoadText)) {
    var exception = context.exceptionFor(LoadText);
    return Text('错误: ${exception?.message}');
  }

  return Text(context.state.text);
}

AbortWhenNoInternet

使用AbortWhenNoInternet在离线时静默失败。动作中止而不抛出错误或显示对话框——就像从未被调度一样:

class RefreshData extends AppAction with AbortWhenNoInternet {

  Future<AppState?> reduce() async {
    var response = await http.get('https://api.example.com/data');
    return state.copy(data: response.body);
  }
}

这适用于后台刷新或非关键操作,无需用户通知。

UnlimitedRetryCheckInternet

此mixin结合了三个功能:互联网验证、指数退避的无限重试和非重入行为。它适用于关键操作,如加载启动数据:

class LoadAppStartupData extends AppAction with UnlimitedRetryCheckInternet {

  Future<AppState?> reduce() async {
    var response = await http.get('https://api.example.com/startup');
    return state.copy(startupData: response.body);
  }
}

默认重试参数:

  • 初始延迟:350毫秒
  • 乘数:2
  • 有互联网时的最大延迟:5秒
  • 无互联网时的最大延迟:1秒

通过attempts getter跟踪重试次数,通过printRetries()自定义日志记录。

Mixin 兼容性

重要兼容规则:

  • CheckInternetAbortWhenNoInternet彼此不兼容
  • CheckInternetAbortWhenNoInternet都不能与UnlimitedRetryCheckInternet结合使用
  • CheckInternetRetryNonReentrantThrottleDebounce和乐观mixin兼容良好

测试互联网连接

在测试中模拟连接的两种方法:

按动作模拟 - 在特定动作中重写internetOnOffSimulation

class LoadText extends AppAction with CheckInternet {
  @override
  bool? get internetOnOffSimulation => false; // 模拟离线

  Future<AppState?> reduce() async {
    // ...
  }
}

全局模拟 - 在store上设置forceInternetOnOffSimulation

var store = Store<AppState>(
  initialState: AppState.initialState(),
);
store.forceInternetOnOffSimulation = false; // 所有动作看到无互联网

限制

这些mixin仅检测设备连接状态。无法验证:

  • 互联网提供商功能
  • 服务器可用性
  • API端点可达性

对于特定服务器连接检查,请在动作的reduce()方法或before()方法中实施额外验证。

参考文献

文档URL: