簡體   English   中英

Flutter:Futurebuilder 未捕獲異常

[英]Flutter : Futurebuilder not catch exception

我有通用 class 來請求名為ReusableRequestServer的服務器,如果在向服務器發出請求時發生錯誤,這個 class 將處理一些異常。

可重用的請求服務器

class ReusableRequestServer<T> {
  Future<T> requestServer(FutureOr<T> requestServer()) async {
    try {
      return await requestServer();
    } on FormatException catch (_) {
      throw ConstText.FORMAT_EXCEPTION;
    } on TimeoutException catch (_) {
      throw ConstText.TIMEOUT_EXCEPTION;
    } on SocketException catch (_) {
      throw ConstText.NO_CONNECTION;
    } catch (e) {
      throw e.toString();
    }
  }
}

final reusableRequestServer = ReusableRequestServer();

我有簡單的get請求以從服務器獲取移動版本,我也實現了ReusableRequestServer

獲取請求

class MobileVersionApi {
  Future<List<MobileVersionModel>> getNewestMobileVersion() async {
    var result = await reusableRequestServer.requestServer(() async {
      final response = await http
          .get('${appConfig.baseApiUrl}/${appConfig.mobileVersionController}/getNewestVersion')
          .timeout(Duration(seconds: 10));
      final Map<String, dynamic> responseJson = json.decode(response.body);
      if (responseJson["status"] == "ok") {
        List mobileVersionList = responseJson["data"];
        List<MobileVersionModel> result =
            mobileVersionList.map((json) => MobileVersionModel.fromjson(json)).toList();
        return result;
      } else {
        throw responseJson['message'];
      }
    });
    return result;
  }
}

final mobileVersionApi = MobileVersionApi();

但是問題是當我在futurebuilder中使用請求時,即使我已經以兩種方式處理了它:

  • 創建分離的Future,避免在futurebuilder中直接傳遞future
  • 用 Try Catch 處理

如果 snapshot.hasError並導致應用程序崩潰,則未捕獲異常。

未來建造者

Future<List<MobileVersionModel>> mobileVersion;
  Future<List<AppInfoModel>> appInfo;

  @override
  void initState() {
    super.initState();
    final appInfoProvider = Provider.of<AppInfoProvider>(context, listen: false);
    mobileVersion = getMobileVersion();
    appInfo = getAppInfo(appInfoProvider);
  }

  Future<List<MobileVersionModel>> getMobileVersion() async {
    try {
      final result = await mobileVersionApi.getNewestMobileVersion();
      return result;
    } catch (e) {
      globalF.showToast(message: e, isError: true);
      return null;
    }
  }

  Future<List<AppInfoModel>> getAppInfo(AppInfoProvider appInfoProvider) async {
    try {
      final result = appInfoApi.getLogoClient().then((value) {
        appInfoProvider.setAppInfo(value);
        if (value[0].updateTime != appInfoProvider.appInfo.updateTime) {
          globalF.clearCacheApp(); //clears all data in cache.
        }
      });
      return result;
    } catch (e) {
      globalF.showToast(message: e, isError: true);
      return null;
    }
  }

Widget build(BuildContext context) {
    return Scaffold(
      body: Consumer2<GlobalProvider, UserProvider>(
        builder: (_, globalProvider, userProvider, __) => FutureBuilder(
          future: Future.wait([
            mobileVersion,
            appInfo,
          ]),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return LoadingFutureBuilder();
            } else {
              if (snapshot.hasError) {
                return ErrorFutureBuilder(errorText: snapshot.error.toString());
              } else {
                  return Text('Hore');
              }
            }
          },
        ),
      ),
    );
  }

錯誤

Exception has occurred.
SocketException (SocketException: Failed host lookup: 'xxx.net' (OS Error: No address associated with hostname, errno = 7))

在此處輸入圖像描述 我錯過了什么地方? 謝謝

在 catch 語句中嘗試返回 Future.error。

前任:

catch (e){
   return Future.error(e.toString());
}
Future<List<MobileVersionModel>> getNewestMobileVersion() async {
try{
    var result = await reusableRequestServer.requestServer(() async {
      final response = await http
          .get('${appConfig.baseApiUrl}/${appConfig.mobileVersionController}/getNewestVersion')
          .timeout(Duration(seconds: 10));
      final Map<String, dynamic> responseJson = json.decode(response.body);
      if (responseJson["status"] == "ok") {
        List mobileVersionList = responseJson["data"];
        List<MobileVersionModel> result =
            mobileVersionList.map((json) => MobileVersionModel.fromjson(json)).toList();
        return result;
      } else {
        throw responseJson['message'];
      }
    });}
catch(e) {
//catch error here
}
    return result;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM