track_choose_friend_dialog.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  5. import 'package:location/module/track/track_dialog/track_choose_friend_item.dart';
  6. import 'package:location/resource/string.gen.dart';
  7. import 'package:location/utils/common_expand.dart';
  8. import '../../../data/bean/user_info.dart';
  9. import '../../../resource/assets.gen.dart';
  10. import '../../../resource/colors.gen.dart';
  11. class TrackChooseFriendDialog {
  12. static const String _tag = 'TrackChooseFriendDialog';
  13. static void show({List<UserInfo>? trackDailyList,SelectAcceptCallback? onSelectItem}) {
  14. SmartDialog.show(
  15. builder: (_) => TrackChooseFriendView(confirmOnTap: () {},trackDailyList: trackDailyList,onSelectItem: onSelectItem,),
  16. tag: _tag,
  17. clickMaskDismiss: false);
  18. }
  19. static void dismiss() {
  20. SmartDialog.dismiss(tag: _tag);
  21. }
  22. }
  23. class TrackChooseFriendView extends StatefulWidget {
  24. final VoidCallback? cancelOnTap;
  25. final VoidCallback? confirmOnTap;
  26. final List<UserInfo>? trackDailyList;
  27. final SelectAcceptCallback? onSelectItem;
  28. const TrackChooseFriendView({
  29. super.key,
  30. this.cancelOnTap,
  31. required this.confirmOnTap,
  32. this.trackDailyList,
  33. this.onSelectItem
  34. });
  35. @override
  36. State<TrackChooseFriendView> createState() => _TrackChooseFriendViewState();
  37. }
  38. class _TrackChooseFriendViewState extends State<TrackChooseFriendView> {
  39. UserInfo selectDailyDialogsInfo = UserInfo(phoneNumber: "0", id: '0');
  40. @override
  41. void initState() {
  42. // TODO: implement initState
  43. super.initState();
  44. if ((widget.trackDailyList ?? []).isNotEmpty) {
  45. selectDailyDialogsInfo = (widget.trackDailyList ?? []).first;
  46. }
  47. }
  48. @override
  49. Widget build(BuildContext context) {
  50. return Container(
  51. width: 274.w,
  52. decoration: BoxDecoration(
  53. borderRadius: BorderRadius.circular(16),
  54. border: Border.all(color: Colors.white, width: 3),
  55. gradient: LinearGradient(
  56. begin: Alignment.topCenter,
  57. end: Alignment.bottomCenter,
  58. colors: [
  59. Color(0xFFE4E4FF), // 对应 #E4E4FF
  60. Colors.white, // 对应 #FFF
  61. ],
  62. stops: [0.0, 0.1932], // 对应 0% 和 19.32%
  63. ),
  64. ),
  65. child: Stack(
  66. alignment: Alignment.center,
  67. children: [
  68. Positioned(
  69. top: 16.w,
  70. right: 16.w,
  71. child: GestureDetector(
  72. onTap: onCloseClick,
  73. child: Assets.images.iconDialogClose2
  74. .image(width: 20.w, height: 20.w),
  75. )),
  76. buildAccountReplaceContent(),
  77. ],
  78. ),
  79. );
  80. }
  81. Widget buildAccountReplaceContent() {
  82. return Container(
  83. padding: EdgeInsets.symmetric(horizontal: 20.w),
  84. child: IntrinsicHeight(
  85. child: Column(
  86. children: [
  87. SizedBox(height: 24.w),
  88. Container(
  89. alignment: Alignment.centerLeft,
  90. width: double.infinity,
  91. child: Text("选择任意好友",
  92. style: TextStyle(fontSize: 17.sp, color: '#333333'.color,fontWeight: FontWeight.bold)),
  93. ),
  94. SizedBox(height: 20.w),
  95. Container(
  96. height: 231.w,
  97. child: _buildFriendList(),
  98. ),
  99. GestureDetector(
  100. onTap: onKnowClick,
  101. child: Container(
  102. width: 229.w,
  103. height: 43.w,
  104. decoration: BoxDecoration(
  105. color: ColorName.colorPrimary,
  106. borderRadius: BorderRadius.circular(100.r),
  107. ),
  108. child: Center(
  109. child: Text("立即查看",
  110. style: TextStyle(
  111. fontSize: 14.sp,
  112. color: Colors.white,
  113. fontWeight: FontWeight.w500)),
  114. ),
  115. ),
  116. ),
  117. SizedBox(height: 16.w),
  118. ],
  119. ),
  120. ),
  121. );
  122. }
  123. Widget _buildFriendList() {
  124. return ListView.builder(
  125. padding: EdgeInsets.only(top: 0, bottom: 100.w),
  126. itemBuilder: (_, index) {
  127. UserInfo itemInfo = (widget.trackDailyList ?? [])[index];
  128. return createUserItem(itemInfo,itemInfo.id == selectDailyDialogsInfo.id, onSelectItem: (selectInfo) {
  129. selectDailyDialogsInfo = selectInfo;
  130. setState(() {
  131. });
  132. });
  133. },
  134. itemCount: (widget.trackDailyList ?? []).length);
  135. }
  136. void onCloseClick() {
  137. TrackChooseFriendDialog.dismiss();
  138. }
  139. void onKnowClick() {
  140. widget.onSelectItem!(selectDailyDialogsInfo);
  141. TrackChooseFriendDialog.dismiss();
  142. }
  143. }