vid_image.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import 'dart:io';
  2. import 'package:fis_lib_report/pages/components/vid.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:vid/us/vid_us_image.dart';
  5. class VidImageView {
  6. /// 创建一个从网络链接加载Vid图片的组件
  7. ///
  8. /// [url] vid图片链接
  9. ///
  10. /// 其他参数参考[Image]组件
  11. static Widget network(
  12. String url, {
  13. Key? key,
  14. double? width,
  15. double? height,
  16. Widget Function(BuildContext context)? loadingBuilder,
  17. ImageErrorWidgetBuilder? errorBuilder,
  18. Animation<double>? opacity,
  19. FilterQuality filterQuality = FilterQuality.low,
  20. BlendMode? colorBlendMode,
  21. BoxFit? fit,
  22. Alignment alignment = Alignment.center,
  23. bool isAntiAlias = false,
  24. bool gaplessPlayback = false,
  25. double scale = 1.0,
  26. }) {
  27. return FutureBuilder(
  28. future: VidFileHelper.getImageFromNetwork(url),
  29. builder: (context, snapshot) => _buildAsyncVidWidget(
  30. context,
  31. snapshot,
  32. loadingBuilder,
  33. errorBuilder,
  34. width: width,
  35. height: height,
  36. opacity: opacity,
  37. filterQuality: filterQuality,
  38. colorBlendMode: colorBlendMode,
  39. fit: fit,
  40. alignment: alignment,
  41. isAntiAlias: isAntiAlias,
  42. gaplessPlayback: gaplessPlayback,
  43. scale: scale,
  44. ),
  45. );
  46. }
  47. /// 创建一个从文件加载Vid图片的组件
  48. ///
  49. /// [file] 文件对象
  50. ///
  51. /// 其他参数参考[Image]组件
  52. static Widget file(
  53. File file, {
  54. Key? key,
  55. double? width,
  56. double? height,
  57. Widget Function(BuildContext context)? loadingBuilder,
  58. ImageErrorWidgetBuilder? errorBuilder,
  59. Animation<double>? opacity,
  60. FilterQuality filterQuality = FilterQuality.low,
  61. BlendMode? colorBlendMode,
  62. BoxFit? fit,
  63. Alignment alignment = Alignment.center,
  64. bool isAntiAlias = false,
  65. bool gaplessPlayback = false,
  66. double scale = 1.0,
  67. }) {
  68. return FutureBuilder(
  69. future: VidFileHelper.getImageFromFile(file),
  70. builder: (context, snapshot) => _buildAsyncVidWidget(
  71. context,
  72. snapshot,
  73. loadingBuilder,
  74. errorBuilder,
  75. width: width,
  76. height: height,
  77. opacity: opacity,
  78. filterQuality: filterQuality,
  79. colorBlendMode: colorBlendMode,
  80. fit: fit,
  81. alignment: alignment,
  82. isAntiAlias: isAntiAlias,
  83. gaplessPlayback: gaplessPlayback,
  84. scale: scale,
  85. ),
  86. );
  87. }
  88. static Widget _buildAsyncVidWidget(
  89. BuildContext context,
  90. AsyncSnapshot<Object?> snapshot,
  91. Widget Function(BuildContext context)? loadingBuilder,
  92. ImageErrorWidgetBuilder? errorBuilder, {
  93. double? width,
  94. double? height,
  95. Animation<double>? opacity,
  96. FilterQuality filterQuality = FilterQuality.low,
  97. BlendMode? colorBlendMode,
  98. BoxFit? fit,
  99. Alignment alignment = Alignment.center,
  100. bool isAntiAlias = false,
  101. bool gaplessPlayback = false,
  102. double scale = 1.0,
  103. }) {
  104. if (snapshot.connectionState == ConnectionState.done) {
  105. if (snapshot.hasData) {
  106. final frame = snapshot.data as VidUsImage;
  107. return Image.memory(
  108. frame.imageData,
  109. width: width,
  110. height: height,
  111. opacity: opacity,
  112. filterQuality: filterQuality,
  113. colorBlendMode: colorBlendMode,
  114. fit: fit,
  115. alignment: alignment,
  116. isAntiAlias: isAntiAlias,
  117. gaplessPlayback: gaplessPlayback,
  118. scale: scale,
  119. );
  120. } else {
  121. final exWidget = errorBuilder != null
  122. ? errorBuilder(
  123. context,
  124. Exception("Vid Image load fail."),
  125. snapshot.stackTrace,
  126. )
  127. : ErrorWidget("Error");
  128. return Container(
  129. alignment: alignment,
  130. width: width,
  131. height: height,
  132. child: exWidget,
  133. );
  134. }
  135. } else {
  136. final loading = loadingBuilder != null
  137. ? loadingBuilder(context)
  138. : const CircularProgressIndicator();
  139. return Container(
  140. alignment: alignment,
  141. width: width,
  142. height: height,
  143. child: loading,
  144. );
  145. }
  146. }
  147. }