123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- 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:webviewx/webviewx.dart';
- import 'controller.dart';
- // ignore: must_be_immutable
- class ContractTemplatePage extends GetView<ContractTemplateController> {
- 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(
- label: "提交",
- onTap: () => controller.submitContract(),
- ),
- ],
- ),
- ),
- )
- ],
- ),
- );
- }
- Future<void> _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:
- '<body style="padding: 100px;">${controller.state.templateContent}</body>',
- ),
- 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<String>(
- future: _loadLocalHtml(context,
- '<html><body style="padding: 100px 0px;">${controller.state.templateContent}</body></html>'),
- 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:
- '<html><body style="padding: 100px;">${controller.state.templateContent}</body></html>',
- javascriptMode: JavascriptMode.unrestricted,
- onWebResourceError: (p0) {},
- onWebViewCreated: (controller) {
- _webViewWebController = controller;
- },
- );
- }
- },
- );
- }
- Widget _buildWebView(BuildContext context) {
- if (kIsWeb) {
- return _buildWebwebview(context);
- } else {
- return _buildAppWebView();
- }
- }
- Future<String> _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<void> 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(
- '<body style="padding: 100px;">${controller.state.templateContent}</body>',
- SourceType.html,
- );
- } else {
- _webViewAppController?.loadData(
- data:
- '<body style="padding: 100px;">${controller.state.templateContent}</body>',
- mimeType: 'text/html',
- encoding: 'utf-8',
- );
- }
- }
- }
|