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 兼容性
重要兼容规则:
CheckInternet和AbortWhenNoInternet彼此不兼容CheckInternet或AbortWhenNoInternet都不能与UnlimitedRetryCheckInternet结合使用CheckInternet与Retry、NonReentrant、Throttle、Debounce和乐观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:
- https://asyncredux.com/flutter/advanced-actions/internet-mixins
- https://asyncredux.com/flutter/advanced-actions/action-mixins
- https://asyncredux.com/flutter/advanced-actions/aborting-the-dispatch
- https://asyncredux.com/flutter/basics/failed-actions
- https://asyncredux.com/flutter/advanced-actions/errors-thrown-by-actions
- https://asyncredux.com/flutter/advanced-actions/control-mixins
- https://asyncredux.com/flutter/advanced-actions/before-and-after-the-reducer
- https://asyncredux.com/flutter/advanced-actions/redux-action
- https://asyncredux.com/flutter/basics/wait-fail-succeed
- https://asyncredux.com/flutter/testing/mocking