2

假设我想在每次调用 Api 时检查互联网连接,如果没有互联网,则调用抛出异常(如NoInternetException),然后向用户显示状态屏幕,告诉他检查他们的连接。

flutter_bloc如果不为图书馆中的每个集团创建新状态,我如何才能实现这一目标?

4

2 回答 2

3

您可以在管理您的根页面(如 authentication_page 和 homepage)的区域中执行此操作。

为 noConnectivity创建一个state

NoConnectivity extends AuthenticationState{
  final String message;

  const NoConnectivity({ this.message });

}

现在为 noConnectivity 创建一个event

NoConnectivityEvent extends AuthenticationEvent{}

最后,在你的 StreamSubscription 中创建一个AuthenticationBloc持续监听connecitvityState变化,如果状态是connectivity.none我们将触发NoConnecitivity状态。

class AuthenticationBloc
    extends Bloc<AuthenticationEvent, AuthenticationState> {

StreamSubscription subscription;

 @override
  AuthenticationState get initialState => initialState();

  @override
  Stream<AuthenticationState> mapEventToState(
    AuthenticationEvent event,
  ) async* {
    // ... all other state map
   else if(event is NoConnectivityEvent) {
     yield* _mapNoConnectivityEventToState();
   }


Stream<AuthenticationState> _mapNoConnectivityEventToState() async * {
     subscription?.cancel();

     //Edit to handle android internet connectivity.
      subscription = Connectivity()
                    .onConnectivityChanged
                    .listen((ConnectivityResult result) {
                         if(Platform.isAndroid) {
                              try {
                                     final lookupResult = InternetAddress.lookup('google.com');
                                     if (lookupResult.isNotEmpty && lookupResult[0].rawAddress.isNotEmpty) {
                                         print('connected');
                                    }
                                  } on SocketException catch (error) {
                                       return add(NoConnectivityState(message: error.message ));
                                  }
                          } else if(result == ConnectivityResult.none ) {
                            return add(NoConnectivityState(message: "Noconnection")) ;

                          }
                           print("Connected");

                    });
}

  @override
  Future<void> close() {
    subscription?.cancel();
    return super.close();
  }

}

此订阅 Stream 将永远收听 ano connection并将您喜欢的相应页面推送到该状态。

所需的软件包

rxdart

连通性

希望能帮助到你!

于 2020-05-08T22:57:55.083 回答
1

你需要基类 bloc 让我们说他的名字“BaseBloc”,他应该从“Bloc”类继承,并实现“mapToStateEvent”方法来处理“noInternet”异常,然后在调用方法之后让我们说他的名字“internalMapToStateEvent”你创建,此方法是覆盖方法,并从“BaseBloc”继承了所有 bloc 类,并且您需要与页面相同的方法来绘制一个小部件“noInternetWidget”

于 2020-05-08T22:02:56.103 回答