123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- import 'dart:convert';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:get/get.dart';
- import 'package:vitalapp/components/dialog_ecg_image.dart';
- import 'package:vitalapp/pages/medical/widgets/twelve_ecg_view/widgets/conclusion_dialog.dart';
- import 'package:vnote_device_plugin/models/exams/twelve_heart.dart';
- class LastRecordTable extends StatelessWidget {
- final bool? isExistLocalData;
- const LastRecordTable({
- super.key,
- this.title,
- required this.columnNames,
- this.columnWidths,
- required this.tableData,
- this.diagnosisTime,
- this.isExistLocalData = false,
- this.checkKey,
- });
- final List<List<String>> tableData;
- final List<String> columnNames;
- final String? title;
- final String? diagnosisTime;
- final String? checkKey;
- final Map<int, TableColumnWidth>? columnWidths;
- @override
- Widget build(BuildContext context) {
- return Container(child: Expanded(child: _buildTable()));
- }
- Widget _buildTable() {
- final scrollController = ScrollController();
- return Column(
- children: [
- const SizedBox(
- height: 10,
- ),
- Table(
- columnWidths: columnWidths,
- children: [
- TableRow(
- decoration: const BoxDecoration(
- color: Color.fromRGBO(215, 234, 255, 1),
- ),
- children: columnNames
- .map((columnName) => _buildHeaderCell(columnName))
- .toList(),
- ),
- ],
- ),
- Expanded(
- child: Scrollbar(
- controller: scrollController,
- thumbVisibility: true,
- child: SingleChildScrollView(
- controller: scrollController,
- child: Table(
- columnWidths: columnWidths,
- children: _buildRow(tableData),
- ),
- ),
- ),
- ),
- const SizedBox(
- height: 10,
- ),
- ],
- );
- }
- List<TableRow> _buildRow(List<List<String>> tableData) {
- // var controller = Get.find<HealthCheckListController>();
- var tableRows = <TableRow>[];
- for (var i = 0; i < tableData.length; i++) {
- final List<String> rowData = tableData[i];
- final label = rowData[0];
- List<Widget> children = [];
- for (String child in rowData) {
- if (rowData.indexOf(child) == 3) {
- continue;
- }
- if (checkKey == "HEITCMC") {
- children.add(_buildConstitutionDataCell(child));
- } else if (label == '心电测量') {
- children.add(_buildImageDataCell(child));
- } else if (label == '十二导心电图(30秒)' || label == "十二导心电图(30秒)") {
- children.add(_buildImageDataCell(child));
- } else if (label == '十二导心电图(5秒)' ||
- label == '十二导心电图(5秒)' ||
- label == '十二导心电图') {
- children.add(_buildImageDataCell(child));
- } else if (label == '十二导分析结果') {
- children.add(_buildEcg12DataCell(child));
- } else {
- children.add(_buildDataCell(child));
- }
- }
- tableRows.add(
- TableRow(
- decoration: i % 2 == 0
- ? null
- : const BoxDecoration(
- color: Color.fromRGBO(233, 244, 255, 1),
- ),
- children: children,
- ),
- );
- }
- return tableRows;
- }
- TableCell _buildConstitutionDataCell(String title) {
- if (title.contains("Value")) {
- title = jsonDecode(title)["Value"].toString();
- } else if (title.contains("质")) {
- title = title.substring(0, 3);
- }
- Widget contentWidget = _buildSizeOverflow(title);
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 37,
- child: contentWidget,
- ),
- );
- }
- TableCell _buildHeaderCell(String title) {
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 37,
- child: Text(
- title,
- style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
- ),
- ),
- );
- }
- /// 12导心电的结果
- TableCell _buildEcg12DataCell(String value) {
- if (value.contains("advice")) {
- return TableCell(
- child: InkWell(
- onTap: () async {
- TwelveHeartResultEntity resultConclusion =
- TwelveHeartResultEntity.fromJson(jsonDecode(value));
- await ConclusionDialog.show(twelveHeartResult: resultConclusion);
- },
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 57,
- child: const Text(
- "点击查看结果",
- style: TextStyle(
- color: Colors.blue,
- ),
- ),
- ),
- ),
- );
- }
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 57,
- child: Text(
- value,
- style: const TextStyle(fontSize: 14),
- ),
- ),
- );
- }
- String _replaceSemicolon(String input) {
- String result = input;
- if (result.endsWith(';')) {
- result = result.replaceAll(';', '');
- } else {
- result = result.replaceAll(';', '、');
- }
- return result;
- }
- Widget _buildSizeOverflow(String title) {
- return LayoutBuilder(
- builder: (BuildContext context, BoxConstraints constraints) {
- final textPainter = TextPainter(
- text: TextSpan(text: title, style: const TextStyle(fontSize: 14)),
- maxLines: 2,
- textDirection: TextDirection.ltr,
- )..layout(maxWidth: constraints.maxWidth);
- Widget contentWidget = Text(
- title,
- style: const TextStyle(
- color: Colors.black,
- fontSize: 14,
- ),
- maxLines: 2,
- overflow: TextOverflow.ellipsis,
- );
- if (textPainter.didExceedMaxLines) {
- contentWidget = Tooltip(
- message: title,
- padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
- textStyle: const TextStyle(fontSize: 14, color: Colors.white),
- triggerMode: TooltipTriggerMode.tap,
- child: contentWidget,
- );
- } else {
- // 文本没有超出
- print('Text did not overflow');
- }
- return contentWidget;
- },
- );
- }
- TableCell _buildDataCell(String title) {
- if (title.contains(";")) {
- title = _replaceSemicolon(title);
- }
- Widget contentWidget = _buildSizeOverflow(title);
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 2),
- alignment: Alignment.centerLeft,
- constraints: BoxConstraints(maxHeight: 48),
- child: Row(children: [Expanded(child: contentWidget)]),
- ),
- );
- }
- TableCell _buildImageDataCell(String title) {
- if (title.length > 50) {
- Uint8List imageBytes = (isExistLocalData! && !kIsWeb)
- ? base64.decode(title)
- : base64.decode(
- "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=");
- return TableCell(
- child: InkWell(
- onTap: () {
- print(title);
- Get.dialog(
- EcgImageDialog(
- image: (isExistLocalData! && !kIsWeb)
- ? Image.memory(
- imageBytes,
- )
- : Image.network(
- title,
- fit: BoxFit.cover,
- ),
- ),
- );
- },
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 8),
- alignment: Alignment.center,
- height: 40,
- child: isExistLocalData!
- ? Image.memory(
- imageBytes,
- fit: BoxFit.fitHeight,
- height: 28,
- )
- : Image.network(
- title,
- fit: BoxFit.fitHeight,
- height: 28,
- ),
- ),
- ),
- );
- }
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 37,
- child: Text(
- title,
- style: const TextStyle(fontSize: 14),
- ),
- ),
- );
- }
- }
|