base_controller.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import 'package:dio/dio.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import '../components/ix_snackbar.dart';
  5. import '../../../config/translations/strings_enum.dart';
  6. import '../constants/enums.dart';
  7. import '../data/models/api_exception.dart';
  8. import '../data/models/failure.dart';
  9. abstract class BaseController extends GetxController {
  10. // 视图状态
  11. final viewState = ViewState.loading.obs;
  12. // 错误信息
  13. final errorMessage = RxString('');
  14. final isNetworkError = false.obs;
  15. // 设置加载状态
  16. void setLoading() {
  17. viewState.value = ViewState.loading;
  18. }
  19. // 设置成功状态
  20. void setSuccess() {
  21. viewState.value = ViewState.success;
  22. }
  23. // 设置空数据状态
  24. void setEmpty() {
  25. viewState.value = ViewState.empty;
  26. }
  27. // 设置错误状态
  28. void setError(String message) {
  29. errorMessage.value = message;
  30. viewState.value = ViewState.error;
  31. }
  32. // 重试方法,子类需要重写
  33. void retry() {}
  34. // 统一处理错误
  35. void handleError(dynamic error) {
  36. if (error is Failure) {
  37. isNetworkError.value = false;
  38. setError(error.message ?? Strings.unknownError.tr);
  39. } else if (error is DioException) {
  40. switch (error.type) {
  41. case DioExceptionType.connectionError:
  42. case DioExceptionType.connectionTimeout:
  43. case DioExceptionType.receiveTimeout:
  44. case DioExceptionType.sendTimeout:
  45. isNetworkError.value = true;
  46. setError(Strings.unableToConnectNetwork.tr);
  47. break;
  48. default:
  49. isNetworkError.value = false;
  50. setError(Strings.unableToConnectServer.tr);
  51. }
  52. } else {
  53. isNetworkError.value = false;
  54. setError(Strings.unknownError.tr);
  55. }
  56. }
  57. List<DiagnosticsNode> crashInfo(Map<String, dynamic> data) {
  58. return data.entries
  59. .map((e) => DiagnosticsNode.message('${e.key}: ${e.value}'))
  60. .toList();
  61. }
  62. void handleSnackBarError(dynamic error, StackTrace stackTrace) {
  63. if (error is ApiException) {
  64. IXSnackBar.showIXErrorSnackBar(
  65. title: Strings.error.tr,
  66. message: error.message,
  67. );
  68. } else if (error is Failure) {
  69. IXSnackBar.showIXErrorSnackBar(
  70. title: Strings.error.tr,
  71. message: error.message ?? Strings.unknownError.tr,
  72. );
  73. } else if (error is DioException) {
  74. switch (error.type) {
  75. case DioExceptionType.connectionError:
  76. case DioExceptionType.connectionTimeout:
  77. case DioExceptionType.receiveTimeout:
  78. case DioExceptionType.sendTimeout:
  79. IXSnackBar.showIXErrorSnackBar(
  80. title: Strings.error.tr,
  81. message: Strings.unableToConnectNetwork.tr,
  82. );
  83. break;
  84. default:
  85. IXSnackBar.showIXErrorSnackBar(
  86. title: Strings.error.tr,
  87. message: Strings.unableToConnectServer.tr,
  88. );
  89. }
  90. } else {
  91. IXSnackBar.showIXErrorSnackBar(
  92. title: Strings.error.tr,
  93. message: Strings.unknownError.tr,
  94. );
  95. }
  96. }
  97. }