假设我想每次打电话给Api时都要检查是否有互联网连接,如果没有互联网,那么调用就会像NoInternetException那样抛出异常,然后向用户显示一个状态屏幕,告诉他检查他们的连接。
如果不为flutter_bloc库中的每个集团创建一个新的状态,我如何才能做到这一点?
发布于 2020-05-08 22:57:55
您可以在管理您的根页面(如authentication_page和主页)的区域中这样做。
为state创建一个noConnectivity。
NoConnectivity extends AuthenticationState{
final String message;
const NoConnectivity({ this.message });
}现在为event创建一个noConnectivity。
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();
}
}此订阅流将永远侦听一个no connection,并将您喜欢的适当页面推送到状态。
必需的软件包
希望能帮上忙!
发布于 2020-05-08 22:02:56
您需要基类组--让我们说他的名字是"BaseBloc",他将继承" bloc“类,并实现"mapToStateEvent”方法来处理"noInternet“异常,在这个调用方法之后,让我们假设他的名字是"internalMapToStateEvent”,这个方法是覆盖方法,从"BaseBloc"继承了所有的mapToStateEvent类,并且您需要相同的页面来绘制一个小部件
https://stackoverflow.com/questions/61631489
复制相似问题