webview_dialog.dart 3.03 KB
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebviewDialog extends StatelessWidget {
  final String title;
  final String webUrl;
  final VoidCallback leftTap;
  final VoidCallback rightTap;

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

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Center(
        child: Text(title),
      ),
      content: SizedBox(
          width: MediaQuery.of(context).size.height - 100,
          height: MediaQuery.of(context).size.width - 100,
          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: <Widget>[
        TextButton(
          child:
              const Text('同意并继续', style: TextStyle(color: Color(0xFFFBB621))),
          onPressed: () {
            // 处理接受按钮的点击事件
            leftTap(); // 关闭对话框
          },
        ),
        TextButton(
          child: const Text('不同意,退出应用'),
          onPressed: () {
            // 处理拒绝按钮的点击事件
            rightTap(); // 关闭对话框
          },
        ),
      ],
    );
  }

  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);
    } catch (error) {
      res = Text("加载失败:${error.toString()}");
      debugPrint("WebViewController加载失败:${error.toString()}");
    }
    return res;
  }
}