import 'dart:convert'; import 'package:fis_lib_report/converts/event_type.dart'; import 'package:fis_lib_report/converts/pt_to_px_converter.dart'; import 'package:fis_lib_report/pages/block_element_page.dart'; import 'package:fis_lib_report/report/interfaces/block_element.dart'; import 'package:fis_lib_report/report/report_template_document.dart'; import 'package:fis_lib_report/report/rt_thickness.dart'; import 'package:fis_lib_report/report_info/report_event_args.dart'; import 'package:fis_lib_report/report_info/report_info.dart'; import 'package:flutter/material.dart'; class ReportEditPage extends StatefulWidget { ReportEditPage({ Key? key, required this.reporter, required this.jsonStr, required this.reportDate, required this.onSelect, this.patinentAge, this.patinentName, this.patinentSex, this.patinentId, this.isReload = true, }) : super(key: key); final FEventHandler onSelect; final String jsonStr; final String reporter; final String? patinentName; final String? patinentId; final String? patinentSex; final String? patinentAge; final DateTime reportDate; bool isReload; @override State createState() { return _ReportEditPageState(); } } class _ReportEditPageState extends State { ReportTemplateDocument _reportTemplate = ReportTemplateDocument(); double _height = 0; double _width = 0; List _blocks = []; List _header = []; List _footer = []; EdgeInsetsGeometry _padding = EdgeInsets.all(PtToPxConverter.ptToPx(56.83)); bool isInit = false; @override initState() { super.initState(); } @override Widget build(BuildContext context) { if (widget.jsonStr.isEmpty) { return const SizedBox(); } if (widget.isReload) { _intitTemplate(); _initListentener(); widget.isReload = false; } final pagePadding = _reportTemplate.pagePadding ?? RTThickness.uniform(56); return Center( child: Container( padding: _padding, alignment: Alignment.center, height: _height, width: _width, color: Colors.white, child: ListView( controller: ScrollController(), children: [ ..._header.map((head) { return Container( width: _width, alignment: Alignment.center, child: BlockElementPage(element: head), ); }), ..._blocks.map((block) { return Container( alignment: Alignment.center, width: _width, child: BlockElementPage(element: block), ); }), const SizedBox(height: 10), ..._footer.map((footer) { return SizedBox( width: _width - PtToPxConverter.ptToPx( pagePadding.left! + pagePadding.right!), child: BlockElementPage(element: footer), ); }), ], ), ), ); } BoxDecoration _buildDecoration() { return BoxDecoration( border: Border.all( width: 0.5, color: const Color.fromARGB(255, 83, 83, 83), ), color: Colors.white); } void _intitTemplate({ReportEventArgs? args}) { String jsonStr = widget.jsonStr; DateTime reportDate = widget.reportDate; String reporter = widget.reporter; if (args != null) { jsonStr = args.jsonStr; reporter = args.reporter; reportDate = args.reportDate; ReportInfo.instance.onReload.addListener((sender, e) { _header.clear(); _blocks.clear(); _footer.clear(); widget.onSelect.dispose(); _intitTemplate(args: e); ReportInfo.instance.onReloadFinsh.emit(this, ''); }); } if (jsonStr.isEmpty) { return; } final reportMap = jsonDecode(jsonStr); setState(() { final template = ReportTemplateDocument.fromJson(reportMap); _reportTemplate = template; ReportInfo.instance.init(_reportTemplate, reportDate, reporter, patientName: widget.patinentName, patientAge: widget.patinentAge, patientSex: widget.patinentSex, patinentId: widget.patinentId); _initPage(); }); if (args != null) { args.onSelect.addListener((sender, e) { ReportInfo.instance.selectedInputImage(e); }); ReportInfo.instance.onClose.addListener((sender, e) { if (mounted) { setState(() { _header.clear(); _blocks.clear(); _footer.clear(); widget.onSelect.dispose(); }); } }); } else { widget.onSelect.addListener((sender, e) { ReportInfo.instance.selectedInputImage(e); }); } isInit = true; } void _initListentener() { ReportInfo.instance.onReload.addListener((sender, e) { _header.clear(); _blocks.clear(); _footer.clear(); widget.onSelect.dispose(); _intitTemplate(args: e); ReportInfo.instance.onReloadFinsh.emit(this, ''); }); ReportInfo.instance.onClose.addListener((sender, e) { if (mounted) { setState(() { _header.clear(); _blocks.clear(); _footer.clear(); widget.onSelect.dispose(); }); } }); } void _initPage() { try { _height = PtToPxConverter.ptToPx(_reportTemplate.pageSize!.height); _width = PtToPxConverter.ptToPx(_reportTemplate.pageSize!.width); final pagePadding = _reportTemplate.pagePadding ?? RTThickness.uniform(56); _padding = EdgeInsets.only( left: PtToPxConverter.ptToPx(pagePadding.left), right: PtToPxConverter.ptToPx(pagePadding.right), top: PtToPxConverter.ptToPx(pagePadding.top), bottom: PtToPxConverter.ptToPx(pagePadding.bottom), ); _footer = _reportTemplate.footer ?? []; _blocks = _reportTemplate.blocks ?? []; _header = _reportTemplate.header ?? []; } catch (e) { _height = 841.8897637795275; _width = 595.275590551181; } } @override void dispose() { ReportInfo.instance.onReload.dispose(); super.dispose(); } }