user_avatar_dialog.dart 3.0 KB

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