Ver Fonte

add:添加每日轨迹弹窗。

zhoukun há 5 meses atrás
pai
commit
54e36e04dc

BIN
assets/images/icon_track_daily_report.webp


+ 10 - 10
lib/di/get_it.config.dart

@@ -56,29 +56,29 @@ extension GetItInjectableX on _i174.GetIt {
       environmentFilter,
     );
     final networkModule = _$NetworkModule();
+    gh.factory<_i973.SplashController>(() => _i973.SplashController());
+    gh.factory<_i756.TrackDetailController>(
+        () => _i756.TrackDetailController());
     gh.factory<_i256.AboutController>(() => _i256.AboutController());
-    gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
+    gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i108.PermissionSettingController>(
         () => _i108.PermissionSettingController());
-    gh.factory<_i973.SplashController>(() => _i973.SplashController());
-    gh.factory<_i756.TrackDetailController>(
-        () => _i756.TrackDetailController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i220.AtmobLocationClient>(
         () => _i220.AtmobLocationClient());
     gh.singleton<_i243.AtmobApi>(
         () => networkModule.provideAtmobApi(gh<_i361.Dio>()));
+    gh.lazySingleton<_i240.TrackRepository>(
+        () => _i240.TrackRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i20.AccountRepository>(
         () => _i20.AccountRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i850.ContactRepository>(
-        () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i1053.FriendsRepository>(
         () => _i1053.FriendsRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i850.ContactRepository>(
+        () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i791.MessageRepository>(
         () => _i791.MessageRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i240.TrackRepository>(
-        () => _i240.TrackRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i983.UrgentContactRepository>(
         () => _i983.UrgentContactRepository(gh<_i243.AtmobApi>()));
     gh.factory<_i1008.LoginController>(
@@ -121,10 +121,10 @@ extension GetItInjectableX on _i174.GetIt {
               gh<_i983.UrgentContactRepository>(),
               gh<_i20.AccountRepository>(),
             ));
-    gh.factory<_i897.AddFriendDialogController>(
-        () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
     gh.factory<_i492.FriendSettingController>(
         () => _i492.FriendSettingController(gh<_i1053.FriendsRepository>()));
+    gh.factory<_i897.AddFriendDialogController>(
+        () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
     gh.lazySingleton<_i814.MemberRepository>(() => _i814.MemberRepository(
           gh<_i243.AtmobApi>(),
           gh<_i20.AccountRepository>(),

+ 5 - 0
lib/module/track/track_day_detail/track_day_detail_controller.dart

@@ -9,6 +9,7 @@ import 'package:location/module/track/track_controller.dart';
 import 'package:location/resource/string.gen.dart';
 
 import '../../../data/bean/track_days.dart';
+import '../track_dialog/track_daily_report_dialog.dart';
 
 class TrackDayDetailController extends BaseController {
   final TrackDays days;
@@ -42,6 +43,10 @@ class TrackDayDetailController extends BaseController {
   @override
   void onReady() {
     super.onReady();
+
+    // TrackDailyReportDialog.show(confirmOnTap: () {
+    //
+    // });
   }
 
   void _requestTrackDaily() {

+ 0 - 0
lib/module/track/track_dialog/track_choose_friend_dialog.dart


+ 176 - 0
lib/module/track/track_dialog/track_daily_report_dialog.dart

@@ -0,0 +1,176 @@
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/module/track/track_dialog/track_overlapping_avatars.dart';
+import 'package:location/resource/colors.gen.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../../resource/assets.gen.dart';
+
+class TrackDailyReportDialog {
+  static void show({
+    VoidCallback? cancelOnTap,
+    VoidCallback? confirmOnTap,}) {
+    Get.dialog(
+        SimpleDialog(
+          titlePadding: EdgeInsets.zero,
+          contentPadding: EdgeInsets.zero,
+          insetPadding: EdgeInsets.zero,
+          backgroundColor:Colors.transparent,
+          children: [
+            TrackDailyReportTipView(
+                cancelOnTap: () {
+                  Get.back();
+                  cancelOnTap!();
+                },
+                confirmOnTap: confirmOnTap)
+          ],
+        )
+    );
+  }
+}
+
+class TrackDailyReportTipView extends StatefulWidget {
+  final VoidCallback? cancelOnTap;
+  final VoidCallback? confirmOnTap;
+
+
+  const TrackDailyReportTipView({
+    super.key,
+    this.cancelOnTap,
+    required this.confirmOnTap,
+  });
+
+  @override
+  State<TrackDailyReportTipView> createState() => _TrackDailyReportTipViewState();
+}
+
+class _TrackDailyReportTipViewState extends State<TrackDailyReportTipView> {
+
+  final List<String> avatarUrls = [
+    'https://picsum.photos/seed/avatar1/200/200',
+    'https://picsum.photos/seed/avatar2/200/200',
+    'https://picsum.photos/seed/avatar3/200/200',
+    'https://picsum.photos/seed/avatar4/200/200',
+    'https://picsum.photos/seed/avatar5/200/200',
+    'https://picsum.photos/seed/avatar5/200/200',
+    'https://picsum.photos/seed/avatar5/200/200',
+  ];
+
+  //计算出头像总共的宽度
+  double _calculateTheTotalWithAvatar(List<String> avatarUrls) {
+    var resultTotalW = 38.w;
+    if (avatarUrls.length > 5) {
+      resultTotalW = (avatarUrls.length - 1) * 29.w + 9.w;
+    } else if (avatarUrls.length > 1) {
+      resultTotalW = (avatarUrls.length - 1) * 29.w + 9.w;
+    }
+    return resultTotalW;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    // TODO: implement build
+    return Container(
+      width: 1.sw,
+      margin: EdgeInsets.symmetric(horizontal: 43.w),
+      child: IntrinsicHeight(
+        child: Column(
+          children: [
+            Container(
+              decoration: BoxDecoration(
+                  color: Colors.transparent,
+                  image: DecorationImage(
+                    image: Assets.images.iconTrackDailyReport.provider(),
+                    fit: BoxFit.fill,
+                  )
+              ),
+              child: Column(
+                children: [
+                  SizedBox(
+                    height: 146.w,
+                  ),
+                  Container(
+                    height: 38.w,
+                    width: _calculateTheTotalWithAvatar(avatarUrls),
+                    child: OverlappingAvatars(
+                      avatarUrls: avatarUrls,
+                      size: 38.w,
+                      overlap: 0.763,
+                      borderColor: "#A287FF".color,
+                      maxDisplay: 5,
+                    ),
+                  ),
+                  SizedBox(
+                    height: 8.w,
+                  ),
+                  Text("昨日轨迹报告",
+                      style: TextStyle(
+                          fontSize: 13.sp,
+                          color: '#57577E'.color,
+                          fontWeight: FontWeight.w700)
+                  ),
+                  SizedBox(
+                    height: 46.w,
+                  ),
+                  GestureDetector(
+                    onTap: () {
+                      Get.back();
+                      widget.confirmOnTap!();
+                    },
+                    child: Container(
+                      decoration: BoxDecoration(
+                        gradient: LinearGradient(
+                          begin: Alignment.centerLeft, // 90度相当于从左到右
+                          end: Alignment.centerRight,
+                          colors: [
+                            Color(0xFF7B7DFF), // #7B7DFF
+                            Color(0xFF6365FF), // #6365FF
+                          ],
+                          stops: [0.0, 1.0],
+                          // 从0%到100%
+                        ),
+                        borderRadius: BorderRadius.circular(40.w / 2.0),
+                      ),
+                      margin: EdgeInsets.symmetric(horizontal: 20.w),
+                      height: 40.w,
+                      alignment: Alignment.center,
+                      child: Text("立即查看",
+                          style: TextStyle(
+                              fontSize: 14.sp,
+                              color: '#FFFFFF'.color,
+                              fontWeight: FontWeight.w500)
+                      ),
+                    ),
+                  ),
+                  SizedBox(
+                    height: 10.w,
+                  ),
+                  GestureDetector(
+                    onTap: widget.cancelOnTap,
+                    child: Container(
+                      height: 20.w,
+                      child: Text("下次再说",
+                          style: TextStyle(
+                              fontSize: 11.sp,
+                              color: '#898996'.color,
+                              fontWeight: FontWeight.w500)
+                      ),
+                    ),
+                  ),
+
+                  SizedBox(
+                    height: 12.w,
+                  ),
+                ],
+              ),
+            )
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 90 - 0
lib/module/track/track_dialog/track_overlapping_avatars.dart

@@ -0,0 +1,90 @@
+import 'package:flutter/material.dart';
+import 'package:location/resource/colors.gen.dart';
+
+class OverlappingAvatars extends StatelessWidget {
+  final List<String> avatarUrls;
+  final double size;
+  final double overlap;
+  final Color borderColor;
+  final double borderWidth;
+  final int maxDisplay;
+  final String moreText;
+  final TextStyle moreTextStyle;
+
+  const OverlappingAvatars({
+    Key? key,
+    required this.avatarUrls,
+    this.size = 40.0,
+    this.overlap = 0.2,
+    this.borderColor = Colors.white,
+    this.borderWidth = 2.0,
+    this.maxDisplay = 4,
+    this.moreText = '+%d',
+    this.moreTextStyle = const TextStyle(
+      color: Colors.white,
+      fontWeight: FontWeight.bold,
+      fontSize: 12,
+    ),
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    final displayCount = avatarUrls.length > maxDisplay
+        ? maxDisplay
+        : avatarUrls.length;
+    final remainingCount = avatarUrls.length - displayCount;
+
+    final widgets = <Widget>[];
+
+    for (var i = 0; i < displayCount; i++) {
+      widgets.add(
+        Container(
+          width: size,
+          height: size,
+          decoration: BoxDecoration(
+            shape: BoxShape.circle,
+            border: Border.all(
+              color: borderColor,
+              width: borderWidth,
+            ),
+          ),
+          child: CircleAvatar(
+            backgroundImage: NetworkImage(avatarUrls[i]),
+          ),
+        ),
+      );
+    }
+
+    if (remainingCount > 0) {
+      widgets.add(
+        Container(
+          width: size,
+          height: size,
+          decoration: BoxDecoration(
+            shape: BoxShape.circle,
+            color: Colors.grey[300],
+            border: Border.all(
+              color: ColorName.white,//borderColor,
+              width: borderWidth,
+            ),
+          ),
+          child: Center(
+            child: Text(
+              moreText.replaceAll('%d', remainingCount.toString()),
+              style: moreTextStyle,
+            ),
+          ),
+        ),
+      );
+    }
+
+    return Stack(
+      children: List.generate(widgets.length, (index) {
+        return Positioned(
+          left: (size * overlap) * index,
+          child: widgets[index],
+        );
+      }),
+    );
+  }
+}

+ 5 - 0
lib/resource/assets.gen.dart

@@ -412,6 +412,10 @@ class $AssetsImagesGen {
   AssetGenImage get iconSplashTitle =>
       const AssetGenImage('assets/images/icon_splash_title.webp');
 
+  /// File path: assets/images/icon_track_daily_report.webp
+  AssetGenImage get iconTrackDailyReport =>
+      const AssetGenImage('assets/images/icon_track_daily_report.webp');
+
   /// File path: assets/images/icon_track_detail_time_base_arrow.webp
   AssetGenImage get iconTrackDetailTimeBaseArrow => const AssetGenImage(
       'assets/images/icon_track_detail_time_base_arrow.webp');
@@ -626,6 +630,7 @@ class $AssetsImagesGen {
         iconNews,
         iconNewsItem,
         iconSplashTitle,
+        iconTrackDailyReport,
         iconTrackDetailTimeBaseArrow,
         iconTrackError,
         iconTrackLocation,

+ 2 - 4
lib/resource/string.gen.dart

@@ -267,12 +267,10 @@ class StringName {
   static String get trackDetailExpand => 'track_detail_expand'.tr; // 全部展开
   static String get trackDetailFold => 'track_detail_fold'.tr; // 全部折叠
   static String get trackDetailMoving => 'track_detail_moving'.tr; // 对方正在移动中
-  static String get trackDetailNoAuthorize =>
-      'track_detail_no_authorize'.tr; // 未授权
+  static String get trackDetailNoAuthorize => 'track_detail_no_authorize'.tr; // 未授权
   static String get trackDetailMobile => 'track_detail_mobile'.tr; // 移动网络
   static String get trackDetailError => 'track_detail_error'.tr; // 当前对方定位丢失
-  static String get trackDetailTimeProportion =>
-      'track_detail_time_proportion'.tr; // 地点占比时长
+  static String get trackDetailTimeProportion => 'track_detail_time_proportion'.tr; // 地点占比时长
 }
 class StringMultiSource {
   StringMultiSource._();