webview_dialog.dart 4.22 KB
import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

class WebviewDialog extends StatelessWidget {
  final String title;
  final String webUrl;
  final String? leftButtonText;
  final String? rightButtonText;
  final VoidCallback? leftTap;
  final VoidCallback? rightTap;
  InAppWebViewController? _inAppWebViewController;

  WebviewDialog(
      {super.key,
      required this.title,
      required this.webUrl,
      this.leftButtonText,
      this.rightButtonText,
      this.leftTap,
      this.rightTap});

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Center(
        child: Text(title),
      ),
      content: SizedBox(
          width: MediaQuery.of(context).size.height,
          height: MediaQuery.of(context).size.height,
          child: FutureBuilder(
              // 异步方法
              future: buildWebViewController(webUrl),
              builder: (context, snapshot) {
                // 等待状态显示的widget
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return const Center(
                    child: CircularProgressIndicator(),
                  );
                  //  错误时显示的widget
                } else if (snapshot.hasError) {
                  return const Text('Error');
                } else {
                  return snapshot.data ?? const Text('No data');
                }
              })),
      actions: (leftButtonText == null && rightButtonText == null)
          ? null
          : <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  TextButton(
                    child: Text(leftButtonText!,
                        style: const TextStyle(color: Color(0xFFFBB621))),
                    onPressed: () {
                      // 处理接受按钮的点击事件
                      leftTap?.call(); // 关闭对话框
                    },
                  ),
                  TextButton(
                    child: Text(rightButtonText!),
                    onPressed: () {
                      // 处理拒绝按钮的点击事件
                      rightTap?.call(); // 关闭对话框
                    },
                  ),
                ],
              )
            ],
    );
  }

  Future<Widget> buildWebViewController(String url) async {
    Widget res;
    try {
      // WebViewController controller = WebViewController()
      //   ..setJavaScriptMode(JavaScriptMode.unrestricted)
      //   ..setBackgroundColor(const Color(0x00000000))
      //   ..setNavigationDelegate(
      //     NavigationDelegate(
      //       onProgress: (int progress) {
      //         // Update loading bar.
      //       },
      //       onPageStarted: (String url) {
      //         EasyLoading.show();
      //       },
      //       onPageFinished: (String url) {
      //         EasyLoading.dismiss();
      //       },
      //       onWebResourceError: (WebResourceError error) {
      //         EasyLoading.showError(error.description);
      //       },
      //       onNavigationRequest: (NavigationRequest request) {
      //         return NavigationDecision.navigate;
      //       },
      //     ),
      //   );
      // await controller.loadRequest(Uri.parse(url));
      // res = WebViewWidget(controller: controller);

      res = InAppWebView(
        initialUrlRequest: URLRequest(url: WebUri.uri(Uri.parse(url))),
        initialUserScripts: UnmodifiableListView<UserScript>([]),
        initialSettings: InAppWebViewSettings(
            javaScriptEnabled: true,
            javaScriptCanOpenWindowsAutomatically: true,
            mediaPlaybackRequiresUserGesture: false,
            transparentBackground: true,
            useHybridComposition: true,
            allowsInlineMediaPlayback: true,
            useShouldOverrideUrlLoading: true,
        ),
        onWebViewCreated: (controller) {
          _inAppWebViewController = controller;
        },
      );
    } catch (error) {
      res = Text("加载失败:${error.toString()}");
      debugPrint("WebViewController加载失败:${error.toString()}");
    }
    return res;
  }
}