123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- 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<ContractRecordsHtmlController> {
- 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:
- '<body style="padding: 100px;">${controller.state.contractRecordDTO.contractedFileUrl ?? ''}</body>',
- 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<String>(
- key: UniqueKey(),
- future: _loadLocalHtml(context,
- '<body style="padding: 100px;">${controller.state.contractRecordDTO.contractedFileUrl ?? ''}</body>'),
- 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<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.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),
- ],
- ),
- ),
- );
- }
- }
|