首页 > 解决方案 > 在继续使用 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 是否是一个好主意。老实说,我想出的解决方案对我来说看起来像是太多的意大利面条代码。

感谢您抽出宝贵的时间,感谢所有建议!

标签: flutterflutter-bloc

解决方案


推荐阅读