step_card_util.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import 'package:keyboard/utils/grid_util.dart';
  4. import 'package:keyboard/utils/upload/upload_scene_type.dart';
  5. import '../data/bean/widget_location.dart';
  6. import '../data/consts/constants.dart';
  7. import '../module/intimacy_analyse/intimacy_analyse_upload/widget/upload_nine_grid.dart';
  8. import '../resource/assets.gen.dart';
  9. /// 步骤卡片工具类
  10. class StepCardUtil {
  11. StepCardUtil._();
  12. /// 是否有添加按钮,如果图片数量小于最大数量,则总数量,要添加1个添加图片的条目
  13. static bool isNeedAddItem(Mode mode, int itemCount, int maxCount) {
  14. // 预览模式,不需要添加
  15. if (mode == Mode.preview) {
  16. return false;
  17. }
  18. // 编辑模式,才有添加按钮
  19. return itemCount < maxCount;
  20. }
  21. /// 计算实际的itemCount
  22. static getRealItemCount(Mode mode, int itemCount, int maxCount) {
  23. int realItemCount;
  24. // 如果图片数量小于最大数量,则总数量,要添加1个添加图片的条目
  25. if (isNeedAddItem(mode, itemCount, maxCount)) {
  26. realItemCount = itemCount + 1;
  27. } else {
  28. // 满了最大数量,则直接显示所有图片
  29. realItemCount = itemCount;
  30. }
  31. return realItemCount;
  32. }
  33. /// 获取卡片背景图片
  34. static ImageProvider getCardBgImageProvider({
  35. required int itemCount,
  36. required UploadSceneType sceneType,
  37. required Mode mode,
  38. int maxCount = Constants.uploadNineGridMaxCount,
  39. int crossAxisCount = Constants.uploadNineGridCrossAxisCount,
  40. }) {
  41. int realItemCount = getRealItemCount(mode, itemCount, maxCount);
  42. // 亲密度分析、对话分析
  43. if (UploadSceneType.intimacyAnalyse == sceneType ||
  44. UploadSceneType.conversationAnalysis == sceneType) {
  45. // 计算出九宫格有多少行
  46. int rowCount = GridUtil.calculateRowCount(realItemCount, crossAxisCount);
  47. // 根据行数不同,使用不同的步骤卡片背景
  48. if (rowCount == 1) {
  49. return Assets.images.bgIntimacyAnalyseUploadCard.provider();
  50. } else if (rowCount == 2) {
  51. return Assets.images.bgIntimacyAnalyseUploadCard2.provider();
  52. } else {
  53. return Assets.images.bgIntimacyAnalyseUploadCard3.provider();
  54. }
  55. } else {
  56. // 识图回复
  57. return Assets.images.bgIntimacyAnalyseUploadCard2.provider();
  58. }
  59. }
  60. /// 计算顶部Icon的位置
  61. static WidgetLocation calculateTopIconWidgetLocation({
  62. required int itemCount,
  63. required UploadSceneType sceneType,
  64. required Mode mode,
  65. int maxCount = Constants.uploadNineGridMaxCount,
  66. int crossAxisCount = Constants.uploadNineGridCrossAxisCount,
  67. }) {
  68. // 识图回复
  69. if (UploadSceneType.scanImageReply == sceneType) {
  70. return WidgetLocation(null, -8.h, 0, null);
  71. } else {
  72. int realItemCount = getRealItemCount(mode, itemCount, maxCount);
  73. // 计算出九宫格有多少行
  74. int rowCount = GridUtil.calculateRowCount(realItemCount, crossAxisCount);
  75. // 亲密度分析
  76. if (UploadSceneType.intimacyAnalyse == sceneType) {
  77. if (rowCount == 1) {
  78. return WidgetLocation(null, -9.h, 0, null);
  79. } else if (rowCount == 2) {
  80. return WidgetLocation(null, -11.h, 0, null);
  81. } else {
  82. return WidgetLocation(null, -11.h, 0, null);
  83. }
  84. } else {
  85. // 对话分析
  86. if (rowCount == 1) {
  87. return WidgetLocation(null, -14.h, 0, null);
  88. } else if (rowCount == 2) {
  89. return WidgetLocation(null, -13.h, 0, null);
  90. } else {
  91. return WidgetLocation(null, -13.h, 0, null);
  92. }
  93. }
  94. }
  95. }
  96. }