周睿 2 yıl önce
ebeveyn
işleme
8430fc1302

+ 40 - 0
app_business/lib/view/home/event_manage/event_manage.dart

@@ -0,0 +1,40 @@
+import 'package:track_common/widget.dart';
+
+import 'event_manage_controller.dart';
+
+class EventManage extends GetView<EventManagerController> {
+  const EventManage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return GetBuilder(
+        init: EventManagerController(),
+        builder: (c) {
+          return Level2View(
+              level1: level1(),
+              level2: level2(),
+              level1Title: '赛事列表',
+              level2Title: '用户列表',
+              level2SubTitle: Obx(() => Text(
+                    c.selected.value?.name != null
+                        ? '(${c.selected.value!.name})'
+                        : '',
+                    style: const TextStyle(color: Colors.grey, fontSize: 14.22),
+                  )));
+        });
+  }
+
+  Iterable<Widget> level1() {
+    return controller.eventList.map((e) => Obx(() => AppTitleList(
+        title: e.name,
+        tail: Text('${e.userCount}'),
+        isSelected: controller.selected.value?.id == e.id)));
+  }
+
+  Iterable<Widget> level2() {
+    return controller.eventList.map((e) => Obx(() => AppTitleList(
+        title: e.name,
+        tail: Text('${e.userCount}'),
+        isSelected: controller.selected.value?.id == e.id)));
+  }
+}

+ 12 - 0
app_business/lib/view/home/event_manage/event_manage_controller.dart

@@ -0,0 +1,12 @@
+import 'package:app_business/service/abase.dart';
+
+class EventInManage {
+  int id = 0;
+  String name = '';
+  int userCount = 0;
+}
+
+class EventManagerController extends GetxController {
+  final selected = Rx<EventInManage?>(null);
+  final eventList = <EventInManage>[].obs;
+}

+ 18 - 31
app_business/lib/view/home/field_control.dart

@@ -1,5 +1,4 @@
 import 'package:track_common/service/map_watch.dart';
-import 'package:track_common/track_common.dart';
 import 'package:track_common/view/home/field_control/field_control.dart';
 import 'package:track_common/view/home/field_control/field_control_controller.dart';
 import 'package:track_common/widget/prelude.dart';
@@ -21,7 +20,7 @@ class FieldControlPageImpl extends FieldControlPage {
                 child: DarkButton(
                     child: const Text('注册比赛'),
                     onPressed: () {
-                      Get.dialog(RegisterDialog());
+                      Get.dialog(const RegisterDialog());
                     })),
             Expanded(
               child: ListView(
@@ -53,11 +52,8 @@ class FieldControlPageImpl extends FieldControlPage {
 
 class FieldControlControllerImpl extends FieldControlController {
   var registerName = '';
-  TimeOfDay? registerStartAt;
-  TimeOfDay? registerStopAt;
-
-  final registerStartAtController = TextEditingController();
-  final registerStopAtController = TextEditingController();
+  final registerStartAt = Rx<TimeOfDay?>(null);
+  final registerStopAt = Rx<TimeOfDay?>(null);
 }
 
 class RegisterDialog extends GetView<FieldControlController> {
@@ -90,33 +86,23 @@ class RegisterDialog extends GetView<FieldControlController> {
               const SizedBox(height: 21.34),
               Row(children: [
                 Expanded(
-                    child: _TextField(
+                    child: Obx(() => _TextField(
                         hint: '开始时间',
                         readOnly: true,
-                        controller: c.registerStartAtController,
+                        initText: c.registerStartAt.value?.format(context),
                         onTap: () async {
-                          debug('onTap');
-                          final t =
-                              await _showTimePicker(context, c.registerStartAt);
-                          c.registerStartAt = t;
-                          if (t != null) {
-                            c.registerStartAtController.text = t.toString();
-                          }
-                        })),
+                          c.registerStartAt.value = await _showTimePicker(
+                              context, c.registerStartAt.value);
+                        }))),
                 const SizedBox(width: 15.64),
                 Expanded(
                     child: _TextField(
                         hint: '结束时间',
                         readOnly: true,
-                        controller: c.registerStopAtController,
+                        initText: c.registerStopAt.value?.format(context),
                         onTap: () async {
-                          debug('onTap');
-                          final t =
-                              await _showTimePicker(context, c.registerStopAt);
-                          c.registerStopAt = t;
-                          if (t != null) {
-                            c.registerStopAtController.text = t.toString();
-                          }
+                          c.registerStopAt.value = await _showTimePicker(
+                              context, c.registerStopAt.value);
                         })),
               ]),
               Row(
@@ -150,20 +136,21 @@ class _TextField extends StatelessWidget {
       this.onChanged,
       this.readOnly = false,
       this.onTap,
-      this.controller});
+      this.initText});
 
   final String hint;
   final void Function(String)? onChanged;
   final bool readOnly;
   final void Function()? onTap;
-  final TextEditingController? controller;
+  final String? initText;
 
   @override
   Widget build(BuildContext context) {
     return SizedBox(
       height: 34.13,
-      child: TextField(
-        controller: controller,
+      child: TextFormField(
+        key: GlobalKey(),
+        initialValue: initText,
         maxLines: 1,
         style: const TextStyle(fontSize: 11.38),
         onChanged: onChanged,
@@ -172,8 +159,8 @@ class _TextField extends StatelessWidget {
         decoration: InputDecoration(
             hintText: hint,
             border: OutlineInputBorder(
-              borderSide: const BorderSide(
-                  width: 0.71, color: Color(0xff818181)), //<-- SEE HERE
+              borderSide:
+                  const BorderSide(width: 0.71, color: Color(0xff818181)),
               borderRadius: BorderRadius.circular(2.13),
             ),
             isDense: true,

+ 4 - 2
app_business/lib/view/home/home.dart

@@ -3,6 +3,7 @@ import 'package:track_common/view.dart';
 import 'package:track_common/view/home/field_control/field_control_controller.dart';
 import 'package:track_common/view/home/map/map_page.dart';
 
+import 'event_manage/event_manage.dart';
 import 'field_control.dart';
 import 'maplist.dart';
 
@@ -24,7 +25,8 @@ class HomeControllerImpl extends HomeController {
             () => GetBuilder<FieldControlController>(
                 init: FieldControlControllerImpl(),
                 builder: (c) {
-                  return FieldControlPageImpl();
-                }))
+                  return const FieldControlPageImpl();
+                })),
+        HomeTab('赛事管理', () => const EventManage()),
       ];
 }

+ 2 - 2
libs/track_common/lib/widget.dart

@@ -1,6 +1,6 @@
 export 'package:flutter/material.dart';
-// export 'generated/assets.dart';
 export 'package:get/get.dart';
 
-// export 'widget/app_net_image.dart';
+export 'widget/app_title_list.dart';
+export 'widget/level2_view.dart';
 export 'widget/title_point.dart';

+ 51 - 0
libs/track_common/lib/widget/app_title_list.dart

@@ -0,0 +1,51 @@
+import 'package:flutter/material.dart';
+
+class AppTitleList extends StatelessWidget {
+  final String title;
+  final Widget tail;
+  final bool isSelected;
+  final VoidCallback? onTap;
+
+  const AppTitleList(
+      {super.key,
+      required this.title,
+      required this.tail,
+      required this.isSelected,
+      this.onTap});
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+        onTap: onTap,
+        child: Container(
+          decoration: const BoxDecoration(color: Color(0xff00a0ff), boxShadow: [
+            BoxShadow(color: Color(0x4d000000), blurRadius: 3.5)
+          ]),
+          height: 41.96,
+          width: double.infinity,
+          margin: const EdgeInsets.only(top: 7),
+          padding: const EdgeInsets.only(right: 11),
+          child: Row(
+            children: [
+              Container(
+                margin: const EdgeInsets.only(right: 10),
+                height: double.infinity,
+                width: 6.4,
+                color:
+                    isSelected ? const Color(0xffff870d) : Colors.transparent,
+              ),
+              Expanded(
+                  child: Text(
+                title,
+                style: const TextStyle(
+                    fontSize: 14.22,
+                    fontWeight: FontWeight.w700,
+                    color: Color(0xff333333)),
+              )),
+              const SizedBox(width: 8),
+              tail
+            ],
+          ),
+        ));
+  }
+}

+ 86 - 0
libs/track_common/lib/widget/level2_view.dart

@@ -0,0 +1,86 @@
+import 'package:flutter/material.dart';
+
+import 'title_point.dart';
+
+class Level2View extends StatelessWidget {
+  const Level2View(
+      {super.key,
+      required this.level1,
+      required this.level2,
+      required this.level1Title,
+      required this.level2Title,
+      required this.level2SubTitle});
+
+  final Iterable<Widget> level1;
+  final Iterable<Widget> level2;
+  final String level1Title;
+  final String level2Title;
+  final Widget level2SubTitle;
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: double.infinity,
+      height: double.infinity,
+      margin: const EdgeInsets.all(20),
+      padding: const EdgeInsets.fromLTRB(12, 17, 12, 17),
+      decoration: BoxDecoration(
+          color: Colors.white, borderRadius: BorderRadius.circular(16)),
+      child: Row(
+        children: [
+          SizedBox(width: 260, height: double.infinity, child: left(context)),
+          const VerticalDivider(
+              width: 15, color: Color(0xffd8d8d8), thickness: 1),
+          Expanded(child: right(context))
+        ],
+      ),
+    );
+  }
+
+  TextStyle get titleStyle => const TextStyle(
+      fontSize: 14.22, color: Color(0xff333333), fontWeight: FontWeight.w700);
+
+  Widget left(BuildContext context) {
+    return Column(
+      children: [
+        Row(
+          children: [
+            const Padding(padding: EdgeInsets.all(8), child: TitlePoint()),
+            Text(level1Title, style: titleStyle),
+            const Spacer(),
+            Container(
+              decoration: BoxDecoration(
+                  border: Border.all(color: const Color(0xffe3e3e3))),
+              child: const Text('2023-06-26'),
+            )
+          ],
+        ),
+        const SizedBox(height: 20),
+        Expanded(
+            child: ListView(
+          children: level1.toList(),
+        )),
+      ],
+    );
+  }
+
+  Widget right(BuildContext context) {
+    return Column(
+      children: [
+        Row(
+          children: [
+            const Padding(padding: EdgeInsets.all(8), child: TitlePoint()),
+            Text(level2Title, style: titleStyle),
+            level2SubTitle,
+          ],
+        ),
+        Expanded(
+            child: Padding(
+                padding: const EdgeInsets.all(18),
+                child: Column(
+                  children: level2.toList(),
+                )))
+      ],
+    );
+  }
+}

+ 2 - 0
libs/track_common/lib/widget/prelude.dart

@@ -3,5 +3,7 @@ export 'package:flutter/material.dart';
 export 'package:get/get.dart';
 
 export '../generated/assets.dart';
+export 'level2_view.dart';
+export 'title_point.dart';
 
 const package = 'track_common';