flutter_bloc 多个集团共享状态
flutter_bloc share state for many blocs
假设我想在每次调用 Api 时检查互联网连接,如果没有互联网,则调用抛出异常 NoInternetException 然后显示状态用户屏幕告诉他检查他们的连接。
如何在不为 flutter_bloc
库中的每个区块创建新状态的情况下实现这一点?
你需要基础 class 集团让我们说他的名字 "BaseBloc" 他将继承 "Bloc" class,并实现 "mapToStateEvent" 方法来处理 "noInternet" 异常,在那个调用方法之后让我们说出他的名字 "internalMapToStateEvent" 你创建的,这个方法是覆盖方法,并继承了你所有的集团 class来自 "BaseBloc" 并且您需要相同的页面来绘制一个小部件 "noInternetWidget"
您可以在管理 authentication_page 和主页等根页面的集团中执行此操作。
为 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
并将您喜欢的相应页面推送到状态。
需要的包
希望对您有所帮助!
假设我想在每次调用 Api 时检查互联网连接,如果没有互联网,则调用抛出异常 NoInternetException 然后显示状态用户屏幕告诉他检查他们的连接。
如何在不为 flutter_bloc
库中的每个区块创建新状态的情况下实现这一点?
你需要基础 class 集团让我们说他的名字 "BaseBloc" 他将继承 "Bloc" class,并实现 "mapToStateEvent" 方法来处理 "noInternet" 异常,在那个调用方法之后让我们说出他的名字 "internalMapToStateEvent" 你创建的,这个方法是覆盖方法,并继承了你所有的集团 class来自 "BaseBloc" 并且您需要相同的页面来绘制一个小部件 "noInternetWidget"
您可以在管理 authentication_page 和主页等根页面的集团中执行此操作。
为 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
并将您喜欢的相应页面推送到状态。
需要的包
希望对您有所帮助!