import 'package:common_pub/common_pub.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:grpc/grpc.dart'; import 'styles/color_schemes.g.dart'; import 'view/login/login_view.dart'; Future tryApi( Future Function() call, { String? errTitle, Future Function(GrpcError err)? onError, Future Function()? onSuccess, VoidCallback? onFinally, }) async { Future handleError(GrpcError err) async { if (onError != null) { return onError(err); } if (err.code == StatusCode.unauthenticated) { if (await LoginView.to()) { try { await call(); } catch (e) { Get.snackbar('出错了', '未知错误'); } } return true; } return false; } await tryCatchGrpc( call, onError: handleError, onSuccess: onSuccess, onFinally: onFinally, ); } extension BuildContextExt on BuildContext { void _showSnakeBar(String msg) { ScaffoldMessenger.of(this).showSnackBar(SnackBar(content: Text(msg))); } Future doCall( Future Function() call, { Future Function(Error err)? onError, Future Function(GrpcError err)? onGrpcError, VoidCallback? onFinally, }) async { try { await call(); } on GrpcError catch (e) { if (onGrpcError != null) { if (await onGrpcError(e)) { return; } } switch (e.code) { case StatusCode.unavailable: _showSnakeBar('网络错误,请稍后再试'); break; case StatusCode.unauthenticated: if (await LoginView.to()) { try { await call(); } catch (e) { _showSnakeBar('出错了,未知错误'); } } break; case StatusCode.unknown: _showSnakeBar('出错了,未知错误'); break; default: _showSnakeBar('出错了,${e.message ?? ''}'); } } on ArgumentError catch (e) { _showSnakeBar('出错了,${kDebugMode ? e.message : '未知错误'}'); } catch (e) { _showSnakeBar('出错了,${kDebugMode ? e.toString() : '未知错误'}'); } finally { onFinally?.call(); } } } class Preview extends StatelessWidget { const Preview({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { return child; } } // typedef NetImage = pb.NetImage; // extension NetImageExt on NetImage { // String? get md5Hex { // if (md5.isEmpty) { // return null; // } else { // return md5.toHexString(); // } // } // // Future readerBuilder() async { // final url = Uri.parse(this.url); // var request = http.Request('GET', url); // var response = await request.send(); // if (response.statusCode != 200) { // throw HttpException('state: ${response.statusCode}', uri: url); // } // final length = response.contentLength ?? 0; // return Reader(response.stream, length); // } // // Future preload() async { // await CacheManager() // .getCached(id: md5Hex ?? '', readerBuilder: readerBuilder); // } // } void runPreview(Widget child) { runApp(GetMaterialApp( theme: ThemeData(useMaterial3: true, colorScheme: lightColorScheme), home: Preview(child: child))); }