utils.dart 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import 'dart:io';
  2. import 'dart:typed_data';
  3. import 'package:application/logger.dart';
  4. import 'package:f_cache/manager.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:get/get.dart';
  7. import 'package:grpc/grpc.dart';
  8. export 'logger.dart';
  9. import 'package:common_pub/common_pub.dart';
  10. import 'styles/color_schemes.g.dart';
  11. import 'view/login/login_view.dart';
  12. import 'pb.dart' as pb;
  13. import 'package:http/http.dart' as http;
  14. Future<void> tryApi(Future<void> Function() call, {
  15. String? errTitle,
  16. Future<bool> Function(GrpcError err)? onError,
  17. Future<void> Function()? onSuccess,
  18. VoidCallback? onFinally,
  19. }) async{
  20. Future<bool> handleError(GrpcError err) async {
  21. if(onError!= null){
  22. return onError(err);
  23. }
  24. if(err.code == StatusCode.unauthenticated){
  25. if (await LoginView.to()){
  26. try{
  27. await call();
  28. }catch(e){
  29. Get.snackbar('出错了', '未知错误');
  30. }
  31. }
  32. return true;
  33. }
  34. return false;
  35. }
  36. await tryCatchGrpc(
  37. call,
  38. onError: handleError,
  39. onSuccess: onSuccess,
  40. onFinally: onFinally,
  41. );
  42. }
  43. class Preview extends StatelessWidget{
  44. const Preview({super.key, required this.child});
  45. final Widget child;
  46. @override
  47. Widget build(BuildContext context) {
  48. return child;
  49. }
  50. }
  51. typedef NetImage = pb.NetImage;
  52. extension NetImageExt on NetImage{
  53. String? get md5Hex {
  54. if(md5.isEmpty){
  55. return null;
  56. }else{
  57. return md5.toHexString();
  58. }
  59. }
  60. Future<Reader> readerBuilder()async{
  61. final url = Uri.parse(this.url);
  62. var request = http.Request('GET', url);
  63. var response = await request.send();
  64. if (response.statusCode != 200) {
  65. throw HttpException('state: ${response.statusCode}', uri: url);
  66. }
  67. final length = response.contentLength ?? 0;
  68. return Reader(response.stream, length);
  69. }
  70. Future<void> preload()async{
  71. await CacheManager().getCached(id: md5Hex ?? '', readerBuilder: readerBuilder);
  72. }
  73. }
  74. void runPreview(Widget child){
  75. runApp(GetMaterialApp(
  76. theme: ThemeData(useMaterial3: true, colorScheme: lightColorScheme),
  77. home: Preview(child: child)));
  78. }