假设我每次打电话给Api时都要检查互联网连接,如果没有互联网,则抛出异常的电话,例如 NoInternetException ,然后向用户显示状态屏幕,告诉用户检查其连接。
如何在不为flutter_bloc
库中的每个集团创建新状态的情况下实现这一目标?
答案 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
,并将您喜欢的适当页面推送到该状态。
必需的软件包
希望有帮助!
答案 1 :(得分:0)
您需要基类bloc,假设他的名字为“ BaseBloc” ,他将从“ Bloc”类继承,并实现“ mapToStateEvent”方法来处理“ noInternet”异常,在此之后进行调用方法,假设您创建了他的名字“ internalMapToStateEvent”,该方法是重写方法,并且继承了“ BaseBloc” 的所有bloc类,并且页面绘制一个小部件“ noInternetWidget “