flutter_bloc为许多集团共享状态

时间:2020-05-06 09:13:11

标签: flutter dart bloc flutter-bloc

假设我每次打电话给Api时都要检查互联网连接,如果没有互联网,则抛出异常的电话,例如 NoInternetException ,然后向用户显示状态屏幕,告诉用户检查其连接。

如何在不为flutter_bloc库中的每个集团创建新状态的情况下实现这一目标?

2 个答案:

答案 0 :(得分:2)

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

为noConnectivity创建一个state

NoConnectivity extends AuthenticationState{
  final String message;

  const NoConnectivity({ this.message });

}

现在为noConnectivity创建一个event

NoConnectivityEvent extends AuthenticationEvent{}

最后,在您的AuthenticationBloc中创建一个StreamSubscription来连续监听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();
  }

}

此订阅流将永远收听no connection,并将您喜欢的适当页面推送到该状态。

必需的软件包

rxdart

connectivity

希望有帮助!

答案 1 :(得分:0)

您需要基类bloc,假设他的名字为“ BaseBloc” ,他将从“ Bloc”类继承,并实现“ mapToStateEvent”方法来处理“ noInternet”异常,在此之后进行调用方法,假设您创建了他的名字“ internalMapToStateEvent”,该方法是重写方法,并且继承了“ BaseBloc” 的所有bloc类,并且页面绘制一个小部件“ noInternetWidget “