utils.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import 'package:common_pub/common_pub.dart';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:get/get.dart';
  5. import 'package:grpc/grpc.dart';
  6. import 'styles/color_schemes.g.dart';
  7. import 'view/login/login_view.dart';
  8. export 'package:common_pub/utils.dart';
  9. Future<void> tryApi(
  10. Future<void> Function() call, {
  11. String? errTitle,
  12. Future<bool> Function(GrpcError err)? onError,
  13. Future<void> Function()? onSuccess,
  14. VoidCallback? onFinally,
  15. }) async {
  16. Future<bool> handleError(GrpcError err) async {
  17. if (onError != null) {
  18. return onError(err);
  19. }
  20. if (err.code == StatusCode.unauthenticated) {
  21. if (await LoginView.to()) {
  22. try {
  23. await call();
  24. } catch (e) {
  25. Get.snackbar('出错了', '未知错误');
  26. }
  27. }
  28. return true;
  29. }
  30. return false;
  31. }
  32. await tryCatchGrpc(
  33. call,
  34. onError: handleError,
  35. onSuccess: onSuccess,
  36. onFinally: onFinally,
  37. );
  38. }
  39. extension BuildContextExt on BuildContext {
  40. void _showSnakeBar(String msg) {
  41. ScaffoldMessenger.of(this).showSnackBar(SnackBar(content: Text(msg)));
  42. }
  43. Future<void> doCall(
  44. Future<void> Function() call, {
  45. Future<bool> Function(Error err)? onError,
  46. Future<bool> Function(GrpcError err)? onGrpcError,
  47. VoidCallback? onFinally,
  48. }) async {
  49. try {
  50. await call();
  51. } on GrpcError catch (e) {
  52. if (onGrpcError != null) {
  53. if (await onGrpcError(e)) {
  54. return;
  55. }
  56. }
  57. switch (e.code) {
  58. case StatusCode.unavailable:
  59. _showSnakeBar('网络错误,请稍后再试');
  60. break;
  61. case StatusCode.unauthenticated:
  62. if (await LoginView.to()) {
  63. try {
  64. await call();
  65. } catch (e) {
  66. _showSnakeBar('出错了,未知错误');
  67. }
  68. }
  69. break;
  70. case StatusCode.unknown:
  71. _showSnakeBar('出错了,未知错误');
  72. break;
  73. default:
  74. _showSnakeBar('出错了,${e.message ?? ''}');
  75. }
  76. } on ArgumentError catch (e) {
  77. _showSnakeBar('出错了,${kDebugMode ? e.message : '未知错误'}');
  78. } catch (e) {
  79. _showSnakeBar('出错了,${kDebugMode ? e.toString() : '未知错误'}');
  80. } finally {
  81. onFinally?.call();
  82. }
  83. }
  84. }
  85. class Preview extends StatelessWidget {
  86. const Preview({super.key, required this.child});
  87. final Widget child;
  88. @override
  89. Widget build(BuildContext context) {
  90. return child;
  91. }
  92. }
  93. // typedef NetImage = pb.NetImage;
  94. // extension NetImageExt on NetImage {
  95. // String? get md5Hex {
  96. // if (md5.isEmpty) {
  97. // return null;
  98. // } else {
  99. // return md5.toHexString();
  100. // }
  101. // }
  102. //
  103. // Future<Reader> readerBuilder() async {
  104. // final url = Uri.parse(this.url);
  105. // var request = http.Request('GET', url);
  106. // var response = await request.send();
  107. // if (response.statusCode != 200) {
  108. // throw HttpException('state: ${response.statusCode}', uri: url);
  109. // }
  110. // final length = response.contentLength ?? 0;
  111. // return Reader(response.stream, length);
  112. // }
  113. //
  114. // Future<void> preload() async {
  115. // await CacheManager()
  116. // .getCached(id: md5Hex ?? '', readerBuilder: readerBuilder);
  117. // }
  118. // }
  119. void runPreview(Widget child) {
  120. runApp(GetMaterialApp(
  121. theme: ThemeData(useMaterial3: true, colorScheme: lightColorScheme),
  122. home: Preview(child: child)));
  123. }