flutter - 在继续使用 BLoC patrren 进入下一个屏幕之前,如何确保与本地服务器的连接可用
问题描述
我的应用程序的每个用户都有应用程序将使用的后端,托管在他们自己的服务器上。
显示应用程序何时启动的第一页包含一个 TextFormField,用户必须在其中填写托管后端的服务器的 IP 地址。
如果连接成功,用户将被重定向到主页。另一个要求是用户应该输入一次 IP 地址,然后,当他们再次启动应用程序时,如果与先前提供的 IP 地址成功连接,他们应该直接重定向到主页(也许启动画面可能是在加载时显示。)。
我正在尝试使用 BLoC 模式来实现所有这些。
我有一个具有以下方法的 ConnectionCubit 类:
Future<void> checkConnection(String? ipAddress) async {
if (ipAddress == null || ipAddress.isEmpty) return;
emit(state.copyWith(status: ConnectionStatus.loading));
try {
final result = await InternetAddress.lookup(ipAddress);
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
emit(state.copyWith(status: ConnectionStatus.success));
} else {
emit(state.copyWith(status: ConnectionStatus.failure));
}
} on Exception {
emit(state.copyWith(status: ConnectionStatus.failure));
}
}
ConnectionState 类仅公开 ConnectionStatus 枚举。
enum ConnectionStatus { initial, loading, success, failure }
MaterialApp 的主页小部件如下:
StreamBuilder<String?>(
stream:
RxSharedPreferences.getInstance().getStringStream('ipAddress'),
builder: (context, snapshot) {
if (snapshot.hasData) {
context.read<ConnectionCubit>().checkConnection(snapshot.data);
return BlocBuilder<ConnectionCubit, connection.ConnectionState>(
builder: (context, state) {
if (state.status.isSuccess) {
return const Text('Login Page');
} else if (state.status.isLoading) {
return const SplashPage();
} else {
return const ConnectionPage();
}
});
} else {
return const ConnectionPage();
}
}),
基本上,当用户填写表格并按下连接按钮时,IP 地址会使用 rx_shared_preferences 包保存。
当用户启动应用程序时,有一个 StreamBuilder 会检查用户之前是否提供了 IP 地址,如果是,则使用提供的 IP 地址调用方法 testConnection。如果连接成功,用户将被重定向到主页,否则他将被重定向到必须提供 IP 地址的页面。如果没有提供 IP 地址,用户将再次被重定向到他必须输入 IP 地址的页面。
所有这些现在都有效,但我是新来的,我在这里询问是否有更好的方法来实现这一点,因为我不确定 StreamBuilder 中的 BlocBuilder 是否是一个好主意。老实说,我想出的解决方案对我来说看起来像是太多的意大利面条代码。
感谢您抽出宝贵的时间,感谢所有建议!
解决方案
推荐阅读
- firebase - firebase deploy 是否有捆绑包大小限制?
- orientdb - Orientdb:获取记录时数据库关闭异常
- node.js - 为什么我的 npm 部署失败了?错误 [ERR_PACKAGE_PATH_NOT_EXPORTED]:在 ./package.json 中没有解决“出口”主要问题
- python - PyQt5:如何将文本从 QTextEdit 拖到 QlistView 中?
- c# - UriBuilder - 删除端口
- bash - 在 Ubuntu 中使用值编辑 Bashrc
- python - 跳过阅读文本文件python中的某些部分
- python - 使用自定义创建操作测试 DRF 模型时出现 KeyError
- angular - Angular项目中的Rxjs websockets
- sql - 动态赋予别名与在 sql server 中声明变量相同