Procházet zdrojové kódy

1、修复样式问题

guanxinyi před 1 rokem
rodič
revize
7fdfefc991

+ 2 - 2
lib/pages/check/widgets/exam_configurable/exam_boold_oxygen.dart

@@ -41,14 +41,14 @@ class _ExamBloodOxygenState extends State<ExamBloodOxygen> {
             children: [
               ExamSideBar(
                 title: '血氧饱和度',
-                value: widget.currentValue['Pulse_Frequency'] ?? '',
+                value: widget.currentValue['Spo2'] ?? '',
                 unit: '%',
                 onTap: () => _inputSpo2("血氧饱和度"),
               ),
               const Divider(indent: 3),
               ExamSideBar(
                 title: '脉率',
-                value: widget.currentValue['Spo2'] ?? '',
+                value: widget.currentValue['Pulse_Frequency'] ?? '',
                 unit: 'bpm',
                 onTap: () => _inputPulseFrequency("脉率"),
               ),

+ 153 - 0
lib/pages/consultation_record_view/widgets/button_group.dart

@@ -0,0 +1,153 @@
+import 'package:fis_ui/index.dart';
+import 'package:flutter/material.dart';
+
+/// ### 按钮组容器
+/// - 用于将一组按钮设置为等宽
+///
+/// 限制:
+/// - 只能放入 Button 组件,当前支持的有:ElevatedButton、FOutlinedButton、ElevatedButtonWithIcon、FDelayedTiriggerButton
+/// - 按钮的 child 当前只支持单个 FText 组件
+/// - 按钮的 padding 需要设为0,如下:
+/// ```dart
+/// FOutlinedButton(
+///   style: ButtonStyle(
+///     padding: MaterialStatePropertyAll(EdgeInsets.all(0)),
+///   ),
+///   child: FText("Text..."),
+///   ...
+/// );
+/// ```
+/// e.g.
+class ButtonGroup extends StatelessWidget {
+  static const List<Type> supportedButtonTypes = [
+    FElevatedButtonWithIcon,
+    ElevatedButton,
+    OutlinedButton,
+  ];
+  ButtonGroup(
+      {super.key,
+      required this.children,
+      this.spacing = 10.0,
+      this.buttonPadding = 16.0})
+      : assert(
+            children.every((e) => supportedButtonTypes.contains(e.runtimeType)),
+            'FButtonGroup children must be Supported');
+  final List<Widget> children;
+
+  /// 按钮间距
+  final double spacing;
+
+  /// 按钮水平内边距
+  final double buttonPadding;
+
+  /// 按钮组件自带的边框宽度
+  static const double _defaultBorderWidth = 1.0;
+
+  /// 遍历获取到每个按钮的宽度,然后取最大值
+  double getMaxWidth() {
+    double maxWidth = 0;
+    for (var i = 0; i < children.length; i++) {
+      var child = children[i];
+      if (child is FElevatedButtonWithIcon) {
+        final double innerSpacing = 8.0;
+        var text = child.label;
+        var icon = child.icon;
+        var iconWidth = 24.0;
+        if (icon is Icon) {
+          iconWidth = getIconWidth(icon);
+        }
+        if (text is Text) {
+          var width = getTextWidth(text) +
+              iconWidth +
+              innerSpacing +
+              _defaultBorderWidth * 2;
+          if (width > maxWidth) {
+            /// 一般情况下 Icon 与 Text 之间存在间距,所以这里需要加上间距
+            maxWidth = width;
+          }
+        }
+      } else if (child is ElevatedButton) {
+        var text = child.child;
+        if (text is Text) {
+          var width = getTextWidth(text) + _defaultBorderWidth * 2;
+          if (width > maxWidth) {
+            maxWidth = width;
+          }
+        }
+      } else if (child is FOutlinedButton) {
+        var text = child.child;
+        if (text is Text) {
+          var width = getTextWidth(text) + _defaultBorderWidth * 2;
+          if (width > maxWidth) {
+            maxWidth = width;
+          }
+        }
+      } else if (child is FDelayedTiriggerButton) {
+        var text = child.child;
+        if (text is Text) {
+          var width = getTextWidth(text) + _defaultBorderWidth * 2 + 16;
+          if (width > maxWidth) {
+            maxWidth = width;
+          }
+        }
+      }
+    }
+    return maxWidth;
+  }
+
+  double getTextWidth(Text text) {
+    final TextStyle style = text.style ?? TextStyle();
+    var textPainter = TextPainter(
+        text: TextSpan(
+            style: style,
+            //     style.copyWith(fontFamily: FTheme.ins.localeSetting.fontFamily),
+            text: text.data),
+        textDirection: TextDirection.ltr,
+        maxLines: 1,
+        textScaleFactor: 1);
+    textPainter.layout();
+    var width = textPainter.width;
+    return width;
+  }
+
+  double getIconWidth(Icon icon) {
+    final double width = icon.size ?? 24.0;
+    return width;
+  }
+
+  double get totalWidth =>
+      getMaxWidth() * children.length +
+      buttonPadding * 2 * children.length +
+      spacing * (children.length - 1);
+
+  @override
+  build(BuildContext context) {
+    return ConstrainedBox(
+      constraints: BoxConstraints.tightFor(width: totalWidth),
+      child: Row(
+          mainAxisAlignment: MainAxisAlignment.center,
+          mainAxisSize: MainAxisSize.max,
+          children: children.map((e) {
+            // ignore: unnecessary_cast
+            return Expanded(child: e) as Widget;
+          }).toList()
+          // .superJoin(FSizedBox(width: spacing)),
+          ),
+    );
+  }
+}
+
+extension ListExt<Widget> on List<Widget> {
+  List<Widget> superJoin(Widget separator) {
+    final iterator = this.iterator;
+    if (!iterator.moveNext()) return [];
+
+    final l = [iterator.current];
+    while (iterator.moveNext()) {
+      l
+        ..add(separator)
+        ..add(iterator.current);
+    }
+    return l;
+  }
+}

+ 5 - 10
lib/pages/consultation_record_view/widgets/consultation_record_filter_drawer.dart

@@ -6,13 +6,10 @@ import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 
-import 'package:fis_theme/theme.dart';
 import 'package:vitalapp/managers/interfaces/models/selected_model.dart';
 import 'package:vitalapp/pages/consultation_record_view/controller.dart';
 import 'package:vitalapp/pages/consultation_record_view/widgets/time_filter.dart';
 
-import 'muti_selected_dialog.dart';
-
 class RecordFilterDrawer extends StatefulWidget implements FPage {
   @override
   State<StatefulWidget> createState() {
@@ -257,9 +254,9 @@ class _RecordFilterDrawerState extends State<RecordFilterDrawer> {
     );
   }
 
-  FWidget _buildFilterButtonList() {
-    return FContainer(
-      child: FRow(
+  Widget _buildFilterButtonList() {
+    return Container(
+      child: Row(
         mainAxisAlignment: MainAxisAlignment.center,
         children: [
           _buildTextButton(
@@ -283,14 +280,12 @@ class _RecordFilterDrawerState extends State<RecordFilterDrawer> {
   }
 
   /// 普通按钮
-  FWidget _buildTextButton(
+  Widget _buildTextButton(
     String textString,
     Function onPressed, {
     MaterialStateProperty<Size?>? fixedSize,
   }) {
-    return FElevatedButton(
-      name: textString,
-      businessParent: widget,
+    return ElevatedButton(
       onPressed: () => onPressed.call(),
       child: FText(
         textString,

+ 6 - 15
lib/pages/consultation_record_view/widgets/operation_buttons_row.dart

@@ -1,20 +1,12 @@
 import 'package:fis_ui/index.dart';
 import 'package:fis_ui/values/spacings.dart';
-import 'package:fis_ui/widgets/layout/button_group.dart';
 import 'package:fis_ui/values/paddings.dart';
-import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:fis_ui/interface/interactive_container.dart';
 import 'package:get/get.dart';
+import 'package:vitalapp/pages/consultation_record_view/widgets/button_group.dart';
 import '../index.dart';
 import 'package:fis_i18n/i18n.dart';
-import 'package:fis_common/index.dart';
-import 'package:fis_common/logger/logger.dart';
-import 'package:fis_i18n/i18n.dart';
-import 'package:fis_ui/base_define/page.dart';
-import 'package:fis_common/event/event_type.dart';
-import 'package:fis_theme/theme.dart';
-import 'package:fis_ui/index.dart';
 
 /// 操作按钮行
 class OperationButtonsRow extends GetView<ConsultationRecordViewController>
@@ -37,7 +29,7 @@ class OperationButtonsRow extends GetView<ConsultationRecordViewController>
   }
 
   Widget _buildButtons() {
-    List<FWidget> children = [
+    List<Widget> children = [
       _buildTextButton(
         i18nBook.remedical.examinationDetails.t,
         () => controller.showInspectionDetailsDialog(),
@@ -70,7 +62,7 @@ class OperationButtonsRow extends GetView<ConsultationRecordViewController>
       ),
       child: Align(
         alignment: Alignment.center,
-        child: FButtonGroup(
+        child: ButtonGroup(
           buttonPadding: FPaddings.MINI_BUTTON,
           spacing: FSpacings.MINI_BUTTON,
           children: children,
@@ -79,10 +71,8 @@ class OperationButtonsRow extends GetView<ConsultationRecordViewController>
     );
   }
 
-  FWidget _buildTextButton(String textString, Function onPressed) {
-    return FElevatedButton(
-      name: textString,
-      businessParent: this,
+  Widget _buildTextButton(String textString, Function onPressed) {
+    return ElevatedButton(
       onPressed: () => onPressed.call(),
       child: FText(
         textString,
@@ -90,6 +80,7 @@ class OperationButtonsRow extends GetView<ConsultationRecordViewController>
       ),
       style: ButtonStyle(
         fixedSize: MaterialStateProperty.all(Size(160, 35)),
+        backgroundColor: MaterialStateProperty.all(Colors.blue),
         padding: MaterialStateProperty.all(
           EdgeInsets.symmetric(
             vertical: 5,

+ 6 - 20
lib/pages/image_report_inner_view/view.dart

@@ -6,18 +6,13 @@ import 'package:get/get.dart';
 import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:fis_jsonrpc/rpc.dart';
-import 'package:fis_theme/theme.dart';
 import 'package:vitalapp/managers/interfaces/models/image_report_list_params.dart';
-import 'package:vitalapp/managers/interfaces/models/report_edit_source.dart';
-import 'package:vitalapp/managers/interfaces/models/vid_image_source.dart' as v;
 import 'package:vitalapp/managers/interfaces/report.dart';
 import 'package:vitalapp/pages/image_report_inner_view/widgets/expansion_panel.dart';
 import 'package:fis_measure/process/workspace/rpc_bridge.dart';
 import 'controller.dart';
 import 'widgets/cloud_image_item.dart';
-import 'widgets/expand_tool_bar.dart';
 import 'widgets/icon_tab_list.dart';
-import 'widgets/image_describe_view.dart';
 import 'widgets/image_zoom_preview_plugin.dart';
 import 'widgets/report_cards_view.dart';
 
@@ -42,7 +37,7 @@ class ImageReportInnerView extends GetView<ImagereportinnerviewController>
       },
       id: MainViewId,
       builder: (_) {
-        return FColumn(
+        return Column(
           children: [
             FSizedBox(
               height: _verticalSpacing,
@@ -69,12 +64,10 @@ class ImageReportInnerView extends GetView<ImagereportinnerviewController>
             ),
             FExpanded(child: _buildGridView()),
             const FSizedBox(height: 8),
-            FRow(
+            Row(
               mainAxisAlignment: MainAxisAlignment.center,
               children: [
-                FElevatedButton(
-                  name: "refersh",
-                  businessParent: this,
+                ElevatedButton(
                   onPressed: () {
                     if (controller.selectedTabIndex == 2) {
                       controller.loadReports();
@@ -93,9 +86,7 @@ class ImageReportInnerView extends GetView<ImagereportinnerviewController>
                   FSizedBox(
                     width: 30,
                   ),
-                  FElevatedButton(
-                    name: "writeReport",
-                    businessParent: this,
+                  ElevatedButton(
                     onPressed: () {
                       controller.reportManager.openReportEdit(
                         controller.patientCode,
@@ -269,13 +260,8 @@ class ImageReportInnerView extends GetView<ImagereportinnerviewController>
     return NoDataWidget();
   }
 
-  void _handleDoubleClick(
-    String imageUrl,
-    int index,
-    String remedicalCode,
-    String? remedicalAISelectedInfoCode, {
-    v.VidImageSource vidImageSource = v.VidImageSource.Remedical,
-  }) {
+  void _handleDoubleClick(String imageUrl, int index, String remedicalCode,
+      String? remedicalAISelectedInfoCode) {
     final reportManager = Get.find<IReportManager>();
     RPCBridge.ins.source = VidImageSource.Remedical;
     reportManager.enterVidMeasurePage(

+ 7 - 6
lib/pages/image_report_inner_view/widgets/icon_tab_list.dart

@@ -1,8 +1,9 @@
 import 'package:flutter/material.dart';
 import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
-import 'package:fis_ui/usual/tab_button.dart';
-import 'package:fis_ui/usual/tab_button_group.dart';
+import 'package:vitalapp/components/quick_fwidget.dart';
+import 'package:vitalapp/pages/image_report_inner_view/widgets/tab_button.dart';
+import 'package:vitalapp/pages/image_report_inner_view/widgets/tab_button_group.dart';
 import 'expandable_icon_text.dart';
 import 'package:fis_i18n/i18n.dart';
 
@@ -51,7 +52,7 @@ class FIconTabListState extends FState<IconTabList> {
 
   @override
   FWidget build(BuildContext context) {
-    return FContainer(
+    return QuickFWidget(Container(
       padding: EdgeInsets.only(left: 10),
       decoration: BoxDecoration(
         border: Border(
@@ -62,10 +63,10 @@ class FIconTabListState extends FState<IconTabList> {
         ),
       ),
       child: i18nBook.isCurrentChinese
-          ? FTabButtonGroup(
+          ? TabButtonGroup(
               widget.tabs.keys.map((e) {
                 var index = widget.tabs.keys.toList().indexOf(e);
-                return FTabButton(
+                return TabButton(
                   padding:
                       const EdgeInsets.symmetric(horizontal: 0, vertical: 8),
                   businessParent: widget,
@@ -109,6 +110,6 @@ class FIconTabListState extends FState<IconTabList> {
                 );
               }).toList(),
             ),
-    );
+    ));
   }
 }

+ 89 - 0
lib/pages/image_report_inner_view/widgets/tab_button.dart

@@ -0,0 +1,89 @@
+import 'package:fis_ui/index.dart';
+import 'package:fis_ui/interface/active_widget.dart';
+import 'package:fis_ui/interface/interactive_container.dart';
+import 'package:flutter/material.dart';
+
+class TabButton extends FStatefulWidget implements FActiveWidget {
+  TabButton({
+    Key? key,
+    required this.businessParent,
+    this.name,
+    this.tabTitle,
+    this.index,
+    this.activeIndex,
+    this.onCallbackTap,
+    this.width = 100,
+    this.disableShadow = false,
+    this.padding = const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
+    this.margin = const EdgeInsets.only(right: 8),
+  }) : super(key: key);
+  final String? tabTitle;
+  final int? index;
+  late final int? activeIndex;
+  final VoidCallback? onCallbackTap;
+  final double width;
+  final EdgeInsetsGeometry? padding;
+  final EdgeInsetsGeometry? margin;
+  final bool disableShadow;
+
+  @override
+  FState<TabButton> createState() => _TabButtonState();
+
+  @override
+  final FInteractiveContainer businessParent;
+
+  @override
+  final String? name;
+}
+
+class _TabButtonState extends FState<TabButton> {
+  get isActive => widget.activeIndex == widget.index;
+
+  @override
+  FWidget build(BuildContext context) {
+    final borderRadius = const Radius.circular(10);
+    final textColorActive = Colors.white;
+    return FContainer(
+      height: 36,
+      alignment: Alignment.center,
+      margin: widget.margin,
+      decoration: widget.disableShadow
+          ? null
+          : BoxDecoration(
+              boxShadow: isActive
+                  ? [
+                      BoxShadow(
+                        color: Colors.black.withOpacity(0.2),
+                        blurRadius: 10,
+                        spreadRadius: 1,
+                        offset: const Offset(5, 5),
+                      )
+                    ]
+                  : []),
+      child: FGestureDetector(
+        businessParent: widget.businessParent,
+        name: widget.name ?? widget.tabTitle ?? '',
+        onTap: widget.onCallbackTap,
+        child: FContainer(
+          child: FCenter(
+            child: FText(
+              widget.tabTitle ?? '',
+              style: isActive
+                  ? TextStyle(color: textColorActive)
+                  : TextStyle(color: Colors.black87),
+            ),
+          ),
+          width: widget.width,
+          padding: widget.padding,
+          decoration: BoxDecoration(
+            color: isActive ? Colors.blue : Colors.white,
+            borderRadius: BorderRadius.only(
+              topLeft: borderRadius,
+              topRight: borderRadius,
+            ),
+          ),
+        ),
+      ),
+    );
+  }
+}

+ 51 - 0
lib/pages/image_report_inner_view/widgets/tab_button_group.dart

@@ -0,0 +1,51 @@
+import 'package:fis_ui/index.dart';
+import 'package:flutter/material.dart';
+
+class TabButtonGroup extends StatefulWidget {
+  TabButtonGroup(
+    this.tabButtonList, {
+    this.margin = const EdgeInsets.only(right: 8),
+    Key? key,
+  }) : super(key: key);
+
+  final List<FWidget>? tabButtonList;
+  final EdgeInsetsGeometry? margin;
+  @override
+  State<TabButtonGroup> createState() => _TabButtonGroupState();
+}
+
+class _TabButtonGroupState extends State<TabButtonGroup> {
+  @override
+  FWidget build(BuildContext context) {
+    return FColumn(
+      children: [
+        FContainer(
+          child: FFlex(
+            direction: Axis.horizontal,
+            mainAxisAlignment: MainAxisAlignment.start,
+            children: [
+              FContainer(
+                height: 36,
+                alignment: Alignment.center,
+                margin: widget.margin,
+                child: FMouseRegion(
+                  cursor: SystemMouseCursors.click,
+                  child: FRow(
+                    children: widget.tabButtonList ?? [],
+                  ),
+                ),
+              ),
+            ],
+          ),
+        ),
+        FSizedBox(
+          height: 4,
+          child: FContainer(
+            height: 4,
+            decoration: BoxDecoration(color: Colors.blue),
+          ),
+        )
+      ],
+    );
+  }
+}

+ 5 - 10
lib/pages/report_edit/view.dart

@@ -13,6 +13,7 @@ import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:fis_common/index.dart';
 import 'package:fis_measure/process/workspace/rpc_bridge.dart';
+import 'package:vitalapp/pages/consultation_record_view/widgets/button_group.dart';
 import 'package:vitalapp/pages/image_report_inner_view/widgets/cloud_image_item.dart';
 import 'package:vitalapp/pages/report_edit/controller.dart';
 import 'package:vitalapp/pages/report_edit/widgets/vocabulary_entry_report.dart';
@@ -202,12 +203,10 @@ class _DesktopLayoutState extends State<_DesktopLayout> {
     );
     return SizedBox(
       height: 50,
-      child: FButtonGroup(
+      child: ButtonGroup(
         buttonPadding: 25,
         children: [
-          FElevatedButton(
-            name: "submitReport",
-            businessParent: this.widget.businessParent,
+          ElevatedButton(
             onPressed: () async {
               await controller.submitReport();
             },
@@ -221,9 +220,7 @@ class _DesktopLayoutState extends State<_DesktopLayout> {
               style: textStyle,
             ),
           ),
-          FElevatedButton(
-            businessParent: this.widget.businessParent,
-            name: "refreshImages",
+          ElevatedButton(
             onPressed: () async {
               await controller.refreshImages();
               setState(() {});
@@ -234,9 +231,7 @@ class _DesktopLayoutState extends State<_DesktopLayout> {
               style: textStyle,
             ),
           ),
-          FElevatedButton(
-            businessParent: this.widget.businessParent,
-            name: "back",
+          ElevatedButton(
             onPressed: () async {
               Get.back();
             },

+ 3 - 6
lib/pages/report_edit/widgets/add_report_tag.dart

@@ -1,5 +1,4 @@
 import 'package:fis_i18n/i18n.dart';
-import 'package:fis_theme/theme.dart';
 import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:fis_ui/widgets/checkbox/rectangle_checkbox.dart';
@@ -118,9 +117,9 @@ class AddReportTagState extends State<AddReportTag> {
               final tagKey = selectTags.keys.toList()[index];
               final tagValues = selectTags[tagKey] ?? [];
               final labelInputController = TextEditingController();
-              return FContainer(
+              return Container(
                 margin: EdgeInsets.symmetric(vertical: 10),
-                child: FRow(
+                child: Row(
                   children: [
                     FContainer(
                       width: 110,
@@ -181,9 +180,7 @@ class AddReportTagState extends State<AddReportTag> {
                       ),
                     ),
                     const FSizedBox(width: 15),
-                    FElevatedButton(
-                      businessParent: widget,
-                      name: "$tagKey",
+                    ElevatedButton(
                       child: FText(i18nBook.common.add.t),
                       onPressed: () {
                         final target = selectedLabes[tagKey] ?? '';

+ 6 - 9
lib/pages/report_edit/widgets/report_share_dialog.dart

@@ -1,5 +1,4 @@
 import 'package:fis_i18n/i18n.dart';
-import 'package:fis_theme/theme.dart';
 import 'package:fis_ui/base_define/page.dart';
 import 'package:fis_ui/index.dart';
 import 'package:flutter/material.dart';
@@ -204,16 +203,16 @@ class ReportShareDialogState extends FState<ReportShareDialog> {
   }
 
   ///短信分享or邮箱分享
-  List<FWidget> _buildShareContentView() {
-    List<FWidget> children = [
+  List<Widget> _buildShareContentView() {
+    List<Widget> children = [
       const FSizedBox(
         height: 340,
         width: 40,
       ),
-      FColumn(
+      Column(
         crossAxisAlignment: CrossAxisAlignment.start,
         children: [
-          FRow(
+          Row(
             children: [
               FSizedBox(height: 40),
               FContainer(
@@ -252,10 +251,8 @@ class ReportShareDialogState extends FState<ReportShareDialog> {
                 ),
               ),
               FSizedBox(width: 10),
-              FContainer(
-                child: FElevatedButton(
-                  businessParent: this.widget,
-                  name: "isEmailShare:$_isEmailShare",
+              Container(
+                child: ElevatedButton(
                   onPressed: () {
                     _isEmailShare ? _addShareEmail() : _addSharePhoneNumber();
                   },