首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >许多块的flutter_bloc共享状态

许多块的flutter_bloc共享状态
EN

Stack Overflow用户
提问于 2020-05-06 09:13:11
回答 2查看 1.8K关注 0票数 3

假设我想每次打电话给Api时都要检查是否有互联网连接,如果没有互联网,那么调用就会像NoInternetException那样抛出异常,然后向用户显示一个状态屏幕,告诉他检查他们的连接。

如果不为flutter_bloc库中的每个集团创建一个新的状态,我如何才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-08 22:57:55

您可以在管理您的根页面(如authentication_page和主页)的区域中这样做。

state创建一个noConnectivity。

代码语言:javascript
复制
NoConnectivity extends AuthenticationState{
  final String message;

  const NoConnectivity({ this.message });

}

现在为event创建一个noConnectivity。

代码语言:javascript
复制
NoConnectivityEvent extends AuthenticationEvent{}

最后,在您的StreamSubscription中创建一个AuthenticationBloc,以持续侦听connecitvityState的更改,如果状态为connectivity.none,我们将触发NoConnecitivity状态。

代码语言:javascript
复制
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,并将您喜欢的适当页面推送到状态。

必需的软件包

雷克斯达特

连通性

希望能帮上忙!

票数 4
EN

Stack Overflow用户

发布于 2020-05-08 22:02:56

您需要基类组--让我们说他的名字是"BaseBloc",他将继承" bloc“类,并实现"mapToStateEvent”方法来处理"noInternet“异常,在这个调用方法之后,让我们假设他的名字是"internalMapToStateEvent”,这个方法是覆盖方法,从"BaseBloc"继承了所有的mapToStateEvent类,并且您需要相同的页面来绘制一个小部件

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61631489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档