如何在Xamarin Forms中实现无网络连接的全局处理
自定义导航服务封装(通用MVVM场景首选)
你用MVVM模式一般都会封装独立的INavigationService做页面跳转控制,直接把网络检查逻辑内嵌到导航方法中即可,完全避免重复代码:
- 统一在导航方法
Task NavigateToAsync(string pageKey, object parameter = null)中先调用Xamarin.Essentials的Connectivity.NetworkAccess判断网络状态 - 无网络时直接弹出全局提示(可调用
Application.Current.MainPage.DisplayAlert或自定义Toast组件),终止后续导航逻辑 - 网络正常时再执行原本的页面跳转逻辑
- 所有视图模型统一调用该导航服务做跳转,无需单独处理网络校验
Shell路由拦截(Shell项目首选)
如果你的项目用Xamarin.Forms Shell做路由管理,直接重写Shell的OnNavigating方法拦截所有导航请求即可,零业务代码侵入:
protected override void OnNavigating(ShellNavigatingEventArgs args) { base.OnNavigating(args); // 过滤掉后退、弹窗等不需要检查网络的导航行为 if (args.Source is ShellNavigationSource.Push or ShellNavigationSource.PushAsync) { if (Connectivity.NetworkAccess != NetworkAccess.Internet) { args.Cancel(); // 主线程弹提示避免UI异常 MainThread.BeginInvokeOnMainThread(async () => { await DisplayAlert("提示", "当前无可用网络,请检查网络设置后重试", "确定"); }); } } }
基类视图模型通用方法封装
如果部分非导航场景也需要校验网络,可以把通用逻辑写到所有视图模型继承的BaseViewModel中:
- 在基类中实现
bool CheckNetworkAvailable()方法,内部包含网络状态判断、无网络提示逻辑,直接返回网络是否可用 - 业务代码中需要校验网络的位置只需要加一行
if (!CheckNetworkAvailable()) return;即可,无需重复写判断和提示逻辑
HttpClient全局异常拦截(请求场景兜底)
如果无网络报错主要出现在API请求阶段,可以给HttpClient加自定义委托处理器,统一捕获无网络异常并弹提示,无需每个接口单独处理:
public class NetworkExceptionHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { try { return await base.SendAsync(request, cancellationToken); } catch (HttpRequestException ex) when (Connectivity.NetworkAccess != NetworkAccess.Internet || ex.InnerException is WebException { Status: WebExceptionStatus.ConnectFailure }) { MainThread.BeginInvokeOnMainThread(async () => { await Application.Current.MainPage.DisplayAlert("网络错误", "网络连接失败,请检查网络后重试", "确定"); }); // 可根据业务需求选择抛出异常或返回自定义错误响应 throw; } } }
使用时将处理器添加到HttpClient构造链即可:var client = new HttpClient(new NetworkExceptionHandler { InnerHandler = new HttpClientHandler() });
内容的提问来源于stack exchange,提问作者toobased_floppa
相关产品推荐
相关产品推荐

