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/advance_debounce.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/components/appbar.dart'; import 'package:vitalapp/components/button.dart'; import 'package:webviewx/webviewx.dart'; import 'controller.dart'; // ignore: must_be_immutable class ContractTemplatePage extends GetView { ContractTemplatePage({super.key}); late InAppWebViewController? _webViewAppController; late WebViewXController? _webViewWebController; @override Widget build(BuildContext context) { return Scaffold( // backgroundColor: const Color.fromRGBO(238, 238, 238, 1), appBar: VAppBar( titleWidget: const Text( "合同", style: TextStyle(fontSize: 24), ), ), body: Column( children: [ Expanded( child: _buildWebView(context), ), Obx( () => Container( height: 100, padding: const EdgeInsets.symmetric(vertical: 20), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ VButton( label: "签字", onTap: () => gotoSignature(), ), if (controller.state.userSignature != '') VButton( child: Text("提交"), onTap: () { advanceDebounce( controller.submitContract, "sumbit", 1500); }, ), ], ), ), ) ], ), ); } Future _scrollToBottom() async { if (_webViewAppController != null) { await _webViewAppController!.scrollTo( x: 0, y: 3000, animated: true, ); } } Widget _buildAppWebView() { return FutureBuilder( future: controller.loadData(), builder: (context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return const Center( child: SizedBox( width: 20, height: 20, child: CircularProgressIndicator(), ), ); } else { return InAppWebView( initialData: InAppWebViewInitialData( data: '${controller.state.templateContent}', ), initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( useShouldOverrideUrlLoading: false, mediaPlaybackRequiresUserGesture: false, cacheEnabled: true, ), android: AndroidInAppWebViewOptions( //设置为 true 以启用混合组合 useHybridComposition: true, ), ), onLoadStart: (controller, url) { PromptBox.loading('加载合同中'); // 显示加载指示器 }, onLoadStop: (controller, url) { PromptBox.dismiss(); }, onWebViewCreated: (InAppWebViewController controller) { _webViewAppController = controller; }, ); } }, ); } Widget _buildWebwebview(BuildContext context) { return FutureBuilder( future: _loadLocalHtml(context, '${controller.state.templateContent}'), 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: '${controller.state.templateContent}', javascriptMode: JavascriptMode.unrestricted, onWebResourceError: (p0) {}, onWebViewCreated: (controller) { _webViewWebController = 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.loadData(); return assetKey; } Future gotoSignature() async { final result = await Get.toNamed("/contract/signature"); if (kDebugMode) { // TODO: 调试记录签名 // await TextStorage( // fileName: "signature_${DateTime.now().millisecondsSinceEpoch}.txt", // directory: "debug", // ).save(result); } controller.state.userSignature = result; final dto = await controller.contractTemplateManager .getContractTemplateDetail(controller.state.templateCode); if (dto != null) { controller.state.templateContent = dto.templateContent ?? ''; controller.getkey(); } _scrollToBottom(); if (kIsWeb) { _webViewWebController?.loadContent( '${controller.state.templateContent}', SourceType.html, ); } else { _webViewAppController?.loadData( data: '${controller.state.templateContent}', mimeType: 'text/html', encoding: 'utf-8', ); } } }