gpt4 book ai didi

许多 Bloc 的 flutter_bloc 共享状态

转载 作者:行者123 更新时间:2023-12-03 03:22:31 25 4
gpt4 key购买 nike

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

如果不为 flutter_bloc 库中的每个 bloc 创建一个新状态,我如何才能实现这一目标?

最佳答案

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

为 noConnectivity 创建一个 state

NoConnectivity extends AuthenticationState{
final String message;

const NoConnectivity({ this.message });

}

现在为 noConnectivity 创建一个事件

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();
}

}

这个订阅 Stream 会永远监听一个无连接并且把你喜欢的合适的页面推送到状态。

必需的包

rxdart

connectivity

希望对您有所帮助!

关于许多 Bloc 的 flutter_bloc 共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61631489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com