123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- import 'dart:convert';
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:get/get.dart';
- import 'alert_dialog.dart';
- class VDialogTable extends StatelessWidget {
- const VDialogTable({
- super.key,
- this.title,
- required this.columnNames,
- required this.tableData,
- this.diagnosisTime,
- });
- final List<List<String>> tableData;
- final List<String> columnNames;
- final String? title;
- final String? diagnosisTime;
- Future<DateTime?> show<DateTime>() => VAlertDialog.showDialog<DateTime>(this);
- @override
- Widget build(BuildContext context) {
- return VAlertDialog(
- width: 800,
- contentPadding: const EdgeInsets.only(left: 16, right: 8),
- content: _buildTable(),
- showCancel: true,
- );
- }
- Widget _buildTable() {
- return SizedBox(
- height: 500,
- child: Column(
- children: [
- const SizedBox(
- height: 10,
- ),
- if (title != null)
- Text(
- title!,
- style: const TextStyle(
- fontSize: 22,
- ),
- ),
- const SizedBox(
- height: 10,
- ),
- Table(
- children: [
- TableRow(
- decoration: const BoxDecoration(
- color: Color.fromRGBO(215, 234, 255, 1),
- ),
- children: columnNames
- .map((columnName) => _buildHeaderCell(columnName))
- .toList(),
- ),
- ],
- ),
- Expanded(
- child: Scrollbar(
- thumbVisibility: true,
- child: SingleChildScrollView(
- child: Table(
- children: _buildRow(tableData),
- ),
- ),
- ),
- ),
- const SizedBox(
- height: 10,
- ),
- Container(
- alignment: Alignment.centerLeft,
- child: Text(
- "检测时间:${diagnosisTime ?? ''}",
- style: const TextStyle(fontSize: 18),
- )),
- const SizedBox(
- height: 10,
- ),
- Container(
- alignment: Alignment.centerLeft,
- child: const Text(
- '注:本结果仅对该检验样本负责!',
- style: TextStyle(fontSize: 18),
- ))
- ],
- ),
- );
- }
- List<TableRow> _buildRow(List<List<String>> tableData) {
- var tableRows = <TableRow>[];
- for (var i = 0; i < tableData.length; i++) {
- tableRows.add(
- TableRow(
- decoration: i % 2 == 0
- ? null
- : const BoxDecoration(
- color: Color.fromRGBO(233, 244, 255, 1),
- ),
- children: tableData[i].map(
- (cellData) {
- if (tableData[i][1] == '心电测量') {
- return _buildImageDataCell(cellData);
- }
- return _buildDataCell(cellData);
- },
- ).toList(),
- ),
- );
- }
- return tableRows;
- }
- 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),
- ),
- ),
- );
- }
- TableCell _buildDataCell(String title) {
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 37,
- child: Text(
- title,
- style: const TextStyle(fontSize: 14),
- ),
- ),
- );
- }
- TableCell _buildImageDataCell(String title) {
- if (title.length > 50) {
- Uint8List imageBytes = base64.decode(title);
- return TableCell(
- child: InkWell(
- onTap: () {
- print(imageBytes);
- Get.dialog(
- ImagePreviewDialog(
- imageBytes: imageBytes,
- ),
- );
- },
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 57,
- child: Image.memory(
- imageBytes,
- height: 57,
- ),
- ),
- ),
- );
- }
- return TableCell(
- child: Container(
- padding: const EdgeInsets.symmetric(horizontal: 14),
- alignment: Alignment.centerLeft,
- height: 37,
- child: Text(
- title,
- style: const TextStyle(fontSize: 14),
- ),
- ),
- );
- }
- }
- class ImagePreviewDialog extends StatelessWidget {
- final Uint8List imageBytes;
- const ImagePreviewDialog({super.key, required this.imageBytes});
- @override
- Widget build(BuildContext context) {
- return Dialog(
- child: SizedBox(
- width: 800,
- height: 500,
- child: Image.memory(imageBytes),
- ),
- );
- }
- }
|