import 'dart:io'; import 'dart:typed_data'; import 'package:f_cache/manager.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:grpc/grpc.dart'; export 'logger.dart'; import 'package:common_pub/common_pub.dart'; import 'styles/color_schemes.g.dart'; import 'view/login/login_view.dart'; import 'pb.dart' as pb; import 'package:http/http.dart' as http; 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, ); } 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); } } extension Uint8ListExtension on Uint8List { String toHexString({String separator = ''}) { return isEmpty ? "" : map((e) { var s = e.toRadixString(16).toUpperCase(); if (e < 10) { s = '0$s'; } return s; }).join(separator); } } extension IntListExtension on List { String toHexString({String separator = ''}) { return isEmpty ? "" : map((e) { var s = e.toRadixString(16).toUpperCase(); if (e < 10) { s = '0$s'; } return s; }).join(separator); } } void runPreview(Widget child){ runApp(GetMaterialApp( theme: ThemeData(useMaterial3: true, colorScheme: lightColorScheme), home: Preview(child: child))); }