user_avatar_view.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import 'package:cached_network_image/cached_network_image.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/src/widgets/framework.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:get/get.dart';
  6. import 'package:get/get_core/src/get_main.dart';
  7. import 'package:location/data/repositories/config_repository.dart';
  8. import 'package:location/module/avatar/user_avatar_controller.dart';
  9. import 'package:location/resource/assets.gen.dart';
  10. import 'package:location/resource/string.gen.dart';
  11. import 'package:location/utils/common_expand.dart';
  12. import '../../handler/error_handler.dart';
  13. import '../../resource/colors.gen.dart';
  14. import '../../utils/common_style.dart';
  15. class UserAvatarView extends GetView<UserAvatarController> {
  16. UserAvatarView({super.key, required List<String> avatarList}) {
  17. Get.lazyPut(() => UserAvatarController(avatarList));
  18. }
  19. static void show() {
  20. ConfigRepository.getInstance().requestUserAvatarList().then((list) {
  21. Get.bottomSheet(UserAvatarView(avatarList: list),
  22. isScrollControlled: true,
  23. barrierColor: ColorName.black55,
  24. backgroundColor: ColorName.transparent);
  25. }).catchError((error) {
  26. ErrorHandler.toastError(error);
  27. });
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. return Container(
  32. width: 1.sw,
  33. decoration: BoxDecoration(
  34. color: Colors.white,
  35. borderRadius: BorderRadius.only(
  36. topLeft: Radius.circular(10.w),
  37. topRight: Radius.circular(10.w),
  38. ),
  39. ),
  40. child: IntrinsicHeight(
  41. child: Column(
  42. children: [
  43. SizedBox(height: 12.w),
  44. buildTitleView(),
  45. SizedBox(height: 22.w),
  46. buildAvatarListView(),
  47. SizedBox(height: 30.w),
  48. buildSureBtnView(),
  49. SizedBox(height: 20.w),
  50. ],
  51. ),
  52. ),
  53. );
  54. }
  55. Widget buildTitleView() {
  56. return Row(
  57. children: [
  58. SizedBox(width: 37.w),
  59. Spacer(),
  60. Text(
  61. StringName.accountPleaseSelectAvatar,
  62. style: TextStyle(fontSize: 14.sp, color: '#404040'.color),
  63. ),
  64. Spacer(),
  65. GestureDetector(
  66. onTap: controller.onCloseClick,
  67. child:
  68. Assets.images.iconAvatarClose.image(width: 25.w, height: 25.w)),
  69. SizedBox(width: 12.w),
  70. ],
  71. );
  72. }
  73. Widget buildAvatarListView() {
  74. return Container(
  75. margin: EdgeInsets.symmetric(horizontal: 20.w),
  76. child: Builder(builder: (context) {
  77. return Wrap(
  78. spacing: 25.w,
  79. runSpacing: 30.w,
  80. children: controller.avatarList.map((url) {
  81. double itemWidth =
  82. (MediaQuery.of(context).size.width - 25.w * 5) / 4;
  83. return GestureDetector(
  84. onTap: () {
  85. controller.onSelectAvatarClick(url);
  86. },
  87. child: buildAvatarItem(itemWidth, url),
  88. );
  89. }).toList(),
  90. );
  91. }));
  92. }
  93. Widget buildAvatarItem(double itemWidth, String url) {
  94. return Stack(
  95. children: [
  96. Container(
  97. width: itemWidth,
  98. height: itemWidth,
  99. decoration: BoxDecoration(
  100. shape: BoxShape.circle,
  101. border: Border.all(width: 1.w, color: '#F0F0F0'.color)),
  102. child: ClipOval(
  103. child: CachedNetworkImage(
  104. width: double.infinity,
  105. height: double.infinity,
  106. imageUrl: url,
  107. fit: BoxFit.cover,
  108. ),
  109. ),
  110. ),
  111. Obx(() {
  112. return Visibility(
  113. visible: controller.selectedAvatar == url ||
  114. (controller.selectedAvatar == null &&
  115. controller.mineInfo?.avatar == url),
  116. child: Container(
  117. width: itemWidth,
  118. height: itemWidth,
  119. decoration: BoxDecoration(
  120. shape: BoxShape.circle,
  121. border:
  122. Border.all(width: 3.w, color: ColorName.colorPrimary)),
  123. ),
  124. );
  125. }),
  126. Obx(() {
  127. return Visibility(
  128. visible: controller.selectedAvatar == url ||
  129. (controller.selectedAvatar == null &&
  130. controller.mineInfo?.avatar == url),
  131. child: Positioned(
  132. bottom: 0,
  133. right: 0,
  134. child: Assets.images.iconAvatarSelected
  135. .image(width: 20.w, height: 20.w)),
  136. );
  137. })
  138. ],
  139. );
  140. }
  141. Widget buildSureBtnView() {
  142. return GestureDetector(
  143. onTap: controller.onSelectedClick,
  144. child: Container(
  145. width: 312.w,
  146. height: 44.w,
  147. decoration: getPrimaryBtnDecoration(100.r),
  148. child: Center(
  149. child: Text(StringName.accountSelectAvatarBtnTxt,
  150. style: TextStyle(fontSize: 15.sp, color: Colors.white))),
  151. ),
  152. );
  153. }
  154. }