周睿 2 năm trước cách đây
mục cha
commit
b2da2f2bd6

+ 50 - 7
lib/view/home/data_detail/data_detail.dart

@@ -1,5 +1,8 @@
+import 'package:application/view/home/data_detail/data_detail_bar_charts.dart';
 import 'package:application/view/home/data_detail/data_detail_cp.dart';
 import 'package:application/widget.dart';
+import 'package:common_pub/model/history_detail.dart';
+import 'package:common_pub/ui/history_detail/trace_bar.dart';
 import 'package:common_pub/ui/map_view/map_view.dart';
 import 'package:common_pub/ui/map_view/view_map_cp.dart';
 import 'package:common_pub/ui/map_view/view_map_image.dart';
@@ -67,14 +70,50 @@ class DataDetailPage extends StatelessWidget {
 
       children.add(ViewMapTouch(map.plugMap));
 
-      return Row(
-        children: [
-          Expanded(child: ViewMapStack(plug: map.plugMap, children: children)),
-          _UserListView(),
-        ],
-      );
+      return Row(children: [
+        Expanded(
+            child: Column(
+          children: [
+            Expanded(
+                child: ViewMapStack(plug: map.plugMap, children: children)),
+            _traceBarView(c)
+          ],
+        )),
+        _UserListView()
+      ]);
     });
   }
+
+  Widget _traceBarView(DataDetailController c) {
+    final detail = c.selectedDetail.value;
+    final children = <Widget>[];
+
+    if (detail != null) {
+      final data = detail.dataChartPage.pace.data
+          .map((e) =>
+              TraceBarData(DataOne(e.x, e.y).toPace())..ts = e.x.milliseconds)
+          .toList();
+      if (data.isNotEmpty) {
+        final ts = data.first.ts - 1.seconds;
+        if (ts > Duration.zero) {
+          data.insert(0, TraceBarData(null)..ts = ts);
+        }
+      }
+      children.addAll([
+        const Text('配速(按时间)'),
+        SizedBox(
+          child: TraceBar(data, controller: c.traceBarController),
+        )
+      ]);
+    }
+
+    return Container(
+      decoration: BoxDecoration(color: Colors.white),
+      height: 73,
+      width: double.infinity,
+      child: Column(children: children),
+    );
+  }
 }
 
 class _UserListView extends GetView<DataDetailController> {
@@ -118,7 +157,11 @@ class _UserListView extends GetView<DataDetailController> {
   List<Widget> _detailView() {
     final detail = controller.selectedDetail.value!;
 
-    return [DataDetailCP(cpList: detail.controlPoints)];
+    return [
+      DataDetailCP(cpList: detail.controlPoints),
+      const SizedBox(height: 8),
+      const DataDetailBarCharts(),
+    ];
   }
 
   Widget _userElem(UserInfo data) {

+ 32 - 0
lib/view/home/data_detail/data_detail_bar_charts.dart

@@ -0,0 +1,32 @@
+import 'package:application/widget/prelude.dart';
+import 'package:common_pub/ui/history_detail/sum_bar_chart.dart';
+import 'data_detail_controller.dart';
+import 'package:get/get.dart';
+
+class DataDetailBarCharts extends GetView<DataDetailController> {
+  const DataDetailBarCharts({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    final detail = controller.selectedDetail.value!;
+
+    return Container(
+      width: double.infinity,
+      padding: const EdgeInsets.all(2.8),
+      decoration: BoxDecoration(
+          color: const Color(0xffe0e0e0),
+          borderRadius: BorderRadius.circular(3.56)),
+      child: Column(children: [
+        BarChartHrPRange(hrPercentRangeList: detail.hrPercentRangeList),
+        const SizedBox(height: 2),
+        BarChartPaceDistance(
+            paceDistancePercentRangeList: detail.paceDistancePercentRangeList,
+            distance: detail.distance),
+        const SizedBox(height: 2),
+        BarChartPaceTime(
+            paceTimePercentRangeList: detail.paceTimePercentRangeList,
+            duration: detail.duration)
+      ]),
+    );
+  }
+}

+ 16 - 2
lib/view/home/data_detail/data_detail_controller.dart

@@ -1,7 +1,11 @@
+import 'dart:async';
+
 import 'package:application/logger.dart';
 import 'package:common_pub/model/history_detail.dart';
 import 'package:application/service/api.dart';
 import 'package:application/service/map_watch.dart';
+import 'package:common_pub/ui/history_detail/trace_bar.dart';
+import 'package:common_pub/ui/map_view/view_map_trace.dart';
 import 'package:fixnum/fixnum.dart';
 import 'package:get/get.dart';
 import '../home_controller.dart';
@@ -29,11 +33,15 @@ class DataDetailController extends GetxController {
   final stub = ApiService.to.stub;
   final showDetail = false.obs;
   final isCPExpand = true.obs;
-
+  final traceBarController = TraceBarController();
+  final viewMapTraceController = ViewMapTraceController();
+  StreamSubscription<int?>? _subscriptionTrace;
   @override
   void onInit() {
     super.onInit();
-
+    _subscriptionTrace = traceBarController.cursorState.listen((p0) {
+      viewMapTraceController.cursor = p0;
+    });
     workFlush();
   }
 
@@ -75,4 +83,10 @@ class DataDetailController extends GetxController {
       old.dispose();
     }
   }
+
+  @override
+  void onClose() {
+    super.onClose();
+    _subscriptionTrace?.cancel();
+  }
 }

+ 17 - 2
lib/view/home/home_controller.dart

@@ -1,6 +1,21 @@
+import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:common_pub/ui/history_detail/trace_bar.dart';
 
-class HomeController extends GetxController{
+class HomeController extends GetxController with GetTickerProviderStateMixin {
   final selectMapName = ''.obs;
+  late final TabController tabController;
+  late final traceController = TraceBarController();
 
-}
+  @override
+  void onInit() {
+    super.onInit();
+    tabController = TabController(length: 7, initialIndex: 1,vsync: this);
+  }
+
+  @override
+  void onClose() {
+    super.onClose();
+    tabController.dispose();
+  }
+}

+ 4 - 5
lib/view/home/home_view.dart

@@ -18,13 +18,11 @@ class HomeView extends GetView<HomeController> {
 
   @override
   Widget build(BuildContext context) {
-    return DefaultTabController(
-        initialIndex: 1,
-        length: _tabElems.length,
-        child: Scaffold(
+    return Scaffold(
           appBar: HomeAppBar(
             tab:
                 TabBar(
+                    controller: controller.tabController,
                     tabs: _tabElems.map((e) => Tab(text: e.title)).toList(),
                     labelColor: Colors.white,
                     unselectedLabelColor: Colors.white,
@@ -37,11 +35,12 @@ class HomeView extends GetView<HomeController> {
           body: Container(
             decoration: const BoxDecoration(image: DecorationImage(image: AssetImage(Assets.imagesBkCommonPage), fit: BoxFit.fill)),
             child: TabBarView(
+              controller: controller.tabController,
               physics: const NeverScrollableScrollPhysics(),
               children: _tabElems.map((e) => e.child).toList(),
             )
           ) ,
-        ));
+        );
   }
 }
 

+ 23 - 16
lib/view/home/map/map_page.dart

@@ -84,12 +84,15 @@ class MapPage extends StatelessWidget {
                                 mainAxisSpacing: 10,
                                 childAspectRatio: 1.3),
                         itemBuilder: (context, i) {
-                          return Obx((){
+                          return Obx(() {
                             final data = c.mapList[i];
                             final id = MapWatchService.instance?.id;
                             final s = id == MapId(data.mapId);
-                            return GalleryCardWidget(data: data, position: c.position.value, isSelected: s);
-                          }) ;
+                            return GalleryCardWidget(
+                                data: data,
+                                position: c.position.value,
+                                isSelected: s);
+                          });
                         })))
               ],
             ),
@@ -104,37 +107,42 @@ class GalleryCardWidget extends StatelessWidget {
   final bool isSelected;
   final HomeController c = Get.find();
 
-  GalleryCardWidget({
-    super.key,
-    required this.data,
-    required this.position, required this.isSelected});
+  GalleryCardWidget(
+      {super.key,
+      required this.data,
+      required this.position,
+      required this.isSelected});
 
   void onTap(int id) async {
     await MapWatchService.setMapById(MapId(id));
-    c.selectMapName.value =  data.name;
+    c.selectMapName.value = data.name;
+    c.tabController.index = 2;
   }
 
   @override
   Widget build(BuildContext context) {
     var distance = '--';
-    if ( data.hasDistance()) {
+    if (data.hasDistance()) {
       distance = Distance(m: data.distance).toString();
     }
 
     return GestureDetector(
-      onTap: ()=>onTap(data.mapId),
+      onTap: () => onTap(data.mapId),
       child: Card(
         color: Colors.white,
-        shadowColor: isSelected? Colors.red: null,
+        shadowColor: isSelected ? Colors.red : null,
         surfaceTintColor: Colors.white,
         shape: const RoundedRectangleBorder(
             borderRadius: BorderRadius.all(Radius.circular(5.44))),
         clipBehavior: Clip.antiAlias,
-        elevation: isSelected?8:4,
+        elevation: isSelected ? 8 : 4,
         child: Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
-            AspectRatio(aspectRatio: 1.1, child: AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)),
+            AspectRatio(
+                aspectRatio: 1.1,
+                child:
+                    AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)),
             Expanded(
                 child: Padding(
                     padding: const EdgeInsets.all(6),
@@ -175,7 +183,7 @@ class GalleryCardWidget extends StatelessWidget {
                                 Text(' 1:${data.mapScaleNumber}'),
                                 const Spacer(),
                                 Image.asset(Assets.imagesIcLocation,
-                                    height:  9.6),
+                                    height: 9.6),
                                 Text(' $distance'),
                               ],
                             ))
@@ -192,8 +200,7 @@ class GalleryCardWidget extends StatelessWidget {
       children: [
         SizedBox(
             height: double.infinity,
-            child: AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)
-        ),
+            child: AppNetImage(netImage: data.image, fit: BoxFit.fitHeight)),
       ],
     );
   }

+ 16 - 0
pubspec.lock

@@ -112,6 +112,14 @@ packages:
       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
     source: hosted
     version: "0.7.8"
+  equatable:
+    dependency: transitive
+    description:
+      name: equatable
+      sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
+      url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+    source: hosted
+    version: "2.0.5"
   f_cache:
     dependency: "direct main"
     description:
@@ -144,6 +152,14 @@ packages:
       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
     source: hosted
     version: "1.1.0"
+  fl_chart:
+    dependency: transitive
+    description:
+      name: fl_chart
+      sha256: c1e26c7e48496be85104c16c040950b0436674cdf0737f3f6e95511b2529b592
+      url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+    source: hosted
+    version: "0.63.0"
   flutter:
     dependency: "direct main"
     description: flutter

+ 1 - 1
third_party/common_pub

@@ -1 +1 @@
-Subproject commit dcee187f4113987cbd78593d1472717b0006d640
+Subproject commit 198efb64bb954f4a1fae0b28348df2b064dd3655