utils.dart 3.4 KB

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