user_avatar_dialog.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import 'package:cached_network_image/cached_network_image.dart';
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  6. import 'package:get/get.dart';
  7. import 'package:location/resource/colors.gen.dart';
  8. typedef AvatarSelectedCallback = void Function(String avatarUrl);
  9. class UserAvatarDialog {
  10. static const String _tag = 'UserAvatarDialog';
  11. static void show(List<String> avatarList, String? selectedAvatarUrl,
  12. {required AvatarSelectedCallback onAvatarSelected}) {
  13. SmartDialog.show(
  14. builder: (_) =>
  15. _UserAvatarView(avatarList, onAvatarSelected, selectedAvatarUrl),
  16. tag: _tag);
  17. }
  18. static void dismiss() {
  19. SmartDialog.dismiss(tag: _tag);
  20. }
  21. }
  22. class _UserAvatarView extends StatelessWidget {
  23. final List<String> avatarList;
  24. final RxnString selectedAvatar = RxnString();
  25. final AvatarSelectedCallback onAvatarSelected;
  26. _UserAvatarView(
  27. this.avatarList, this.onAvatarSelected, String? selectedAvatarUrl) {
  28. selectedAvatar.value = selectedAvatarUrl;
  29. }
  30. @override
  31. Widget build(BuildContext context) {
  32. return Container(
  33. color: Colors.white,
  34. width: 278.w,
  35. child: IntrinsicHeight(
  36. child: Column(
  37. children: [
  38. buildSelectAvatarView(),
  39. buildUserAvatarListView(),
  40. SizedBox(height: 30.h),
  41. GestureDetector(
  42. onTap: onSelectSureClick,
  43. child: Container(
  44. margin: EdgeInsets.symmetric(horizontal: 25.w),
  45. decoration: BoxDecoration(
  46. color: ColorName.colorPrimary,
  47. borderRadius: BorderRadius.circular(25.w),
  48. ),
  49. width: 328.w,
  50. height: 40.w,
  51. child: Center(child: Text('确认'))),
  52. ),
  53. SizedBox(height: 20.h),
  54. ],
  55. ),
  56. ),
  57. );
  58. }
  59. Widget buildUserAvatarListView() {
  60. return Wrap(
  61. spacing: 10,
  62. runSpacing: 10,
  63. children: avatarList.map((url) {
  64. return GestureDetector(
  65. onTap: () {
  66. onSelectAvatarClick(url);
  67. },
  68. child: ClipOval(
  69. child: CachedNetworkImage(
  70. width: 50.w,
  71. height: 50.w,
  72. imageUrl: url,
  73. fit: BoxFit.cover,
  74. ),
  75. ),
  76. );
  77. }).toList(),
  78. );
  79. }
  80. Widget buildSelectAvatarView() {
  81. return ClipOval(
  82. child: Obx(() {
  83. return CachedNetworkImage(
  84. width: 50.w,
  85. height: 50.w,
  86. imageUrl: selectedAvatar.value ?? '',
  87. fit: BoxFit.cover,
  88. );
  89. }),
  90. );
  91. }
  92. void onSelectAvatarClick(String avatarUrl) {
  93. selectedAvatar.value = avatarUrl;
  94. }
  95. void onSelectSureClick() {
  96. final avatar = selectedAvatar.value;
  97. if (avatar == null || avatar.isEmpty) {
  98. return;
  99. }
  100. onAvatarSelected(avatar);
  101. }
  102. }