import 'package:fis_common/extensions/date.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:get/get.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/components/appbar.dart'; import 'package:vitalapp/components/button.dart'; import 'package:vitalapp/components/dialog_input.dart'; import 'package:vitalapp/pages/contract/contract_record_html/controller.dart'; import 'package:webviewx/webviewx.dart'; class ContractRecordsHtmlPage extends GetView { const ContractRecordsHtmlPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: VAppBar( titleWidget: const Text( "合同", style: TextStyle(fontSize: 24), ), ), body: Stack( children: [ _buildWebView(context), Positioned( top: 0, left: 0, right: 0, child: Obx(() { final dto = controller.state.contractRecordDTO; return _ServiceTimeEffectRow( startDate: dto.serviceStartDate, endDate: dto.serviceEndDate, ); }), ), Obx( () { return controller.state.contractRecordDTO.contractState != ContractStateEnum.Cancelled ? Positioned( bottom: 8, left: 200, right: 200, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ VButton( label: "解 约", onTap: () async { var result = await const VDialogInput( title: '解约原因', showCancel: true, ).show(); if (result != null) { var uplateResult = await controller .updateContractRecordStateAsync(result); if (uplateResult) { PromptBox.toast('解约成功'); Get.back(); } } }, ), ], ), ) : SizedBox(); }, ), ], ), ); } Widget _buildAppWebView() { return Obx( () => InAppWebView( key: UniqueKey(), initialData: InAppWebViewInitialData( data: '${controller.state.contractRecordDTO.contractedFileUrl ?? ''}', mimeType: 'text/html', encoding: 'utf-8', ), initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( useShouldOverrideUrlLoading: true, mediaPlaybackRequiresUserGesture: false, disableVerticalScroll: false, ), android: AndroidInAppWebViewOptions( //设置为 true 以启用混合组合 useHybridComposition: true, ), ), onWebViewCreated: (InAppWebViewController controller) { // _webViewController = controller; }, onLoadHttpError: (controller, url, statusCode, description) { // ignore: avoid_print print("InAppWebView onLoadHttpError: $description"); }, ), ); } Widget _buildWebwebview(BuildContext context) { return Obx( () => FutureBuilder( key: UniqueKey(), future: _loadLocalHtml(context, '${controller.state.contractRecordDTO.contractedFileUrl ?? ''}'), builder: (context, snapshot) { if (!snapshot.hasData) { return const Center(child: CircularProgressIndicator()); // return FCenter(child: FText("${i18nBook.common.loading.t}...")); } else { return WebViewX( height: MediaQuery.of(Get.context!).size.height, width: MediaQuery.of(Get.context!).size.width, initialSourceType: SourceType.html, initialContent: snapshot.data!, javascriptMode: JavascriptMode.unrestricted, onWebResourceError: (p0) {}, onWebViewCreated: (controller) { // webviewControllerManager.initWebviewController(controller); }, ); } }, ), ); } Widget _buildWebView(BuildContext context) { if (kIsWeb) { return _buildWebwebview(context); } else { return _buildAppWebView(); } } Future _loadLocalHtml(BuildContext context, String assetKey) async { // await Future.delayed(const Duration(milliseconds: 200)); // final start = DateTime.now(); // final content = await DefaultAssetBundle.of(context).loadString(assetKey); // final end = DateTime.now(); // await controller.getContractRecordDetailAsync(); return assetKey; } } /// 服务时效 class _ServiceTimeEffectRow extends StatelessWidget { final DateTime? startDate; final DateTime? endDate; const _ServiceTimeEffectRow({ required this.startDate, required this.endDate, }); @override Widget build(BuildContext context) { if (startDate == null || endDate == null) { return const SizedBox(); } final content = "${startDate!.formatDate()} 至 ${endDate!.formatDate()}"; return Container( alignment: Alignment.center, padding: EdgeInsets.symmetric(vertical: 8), color: Colors.black.withOpacity(.1), child: RichText( text: TextSpan( style: TextStyle(fontSize: 20, color: Colors.black), children: [ TextSpan(text: "服务时限:"), TextSpan(text: content), ], ), ), ); } }