小工具知识网

当前位置: 首页 > 行业知识 > flutter 封装webview和使用本地网页

行业知识

flutter 封装webview和使用本地网页

2026-10-19 21:01:31 来源:互联网转载

���先看到flutter_webview_plugin 用法特别简单

flutter_webview_plugin | Flutter PackagePlugin that allow Flutter to communicate with a native Webview.https://pub-web.flutter-io.cn/packages/flutter_webview_plugin缺点: 没有实现js sdk的功能 没有办法 使用JavaScriptChannel 的功能

后面使用webview_flutter

webview_flutter | Flutter packageA Flutter plugin that provides a WebView widget on Android and iOS.https://pub-web.flutter-io.cn/packages/webview_flutter组件

import 'dart:convert';import 'dart:io';import 'package:flutter/cupertino.dart';import 'package:flutter/foundation.dart';import 'package:flutter/material.dart';import 'package:webview_flutter/webview_flutter.dart';class AppWebView extends StatefulWidget {  final String url;  final Function(dynamic)? onMessageReceived;  const AppWebView({    super.key,    required this.url,    this.onMessageReceived,  });  @override  State createState() => _AppWebViewState();}class _AppWebViewState extends State {  late final WebViewController controller;  int progress = 0;  @override  void initState() {    super.initState();    controller = WebViewController()      ..setJavaScriptMode(JavaScriptMode.unrestricted)      ..addJavaScriptChannel("lh", onMessageReceived: onMessageReceived)      ..enableZoom(true)      ..setBackgroundColor(const Color(0x00000000))      ..setNavigationDelegate(        NavigationDelegate(          onProgress: (int progress) {            // Update loading bar.            this.progress = progress;            setState(() {});          },          onPageStarted: (String url) {},          onPageFinished: (String url) {},          onWebResourceError: (WebResourceError error) {},          onNavigationRequest: (NavigationRequest request) {            if (request.url.startsWith('https://www.youtube.com/')) {              return NavigationDecision.prevent;            }            return NavigationDecision.navigate;          },        ),      )      ..loadRequest(Uri.parse(widget.url));  }  // 接受h5发送来的数据  onMessageReceived(message) async {    widget.onMessageReceived?.call(message);    //接收H5发过来的数据    String sendMesStr = message.message;    print("onMessageReceived sendMesStr:${sendMesStr}");    Map msg = json.decode(sendMesStr);    String method = msg["method"] ?? "";    // Map data = msg["data"] ?? {};    if (method.isNotEmpty) {      switch (method) {        case "back":          controller.goBack();          break;      }    }  }  @override  Widget build(BuildContext context) {    if (!kIsWeb && (Platform.isIOS || Platform.isAndroid)) {      return Scaffold(        // appBar: AppBar(title: const Text('Flutter Simple Example')),        body: Stack(children: [          WebViewWidget(controller: controller),          if (progress != 100)            const Center(              child: CupertinoActivityIndicator(),            )        ]),      );    } else {      return const Center(        child: Text('WebView control is not supported on this platform yet.'),      );    }  }}

使用

Get.to(() => AppWebView(      url: 'http://localhost',      onMessageReceived: onMessageReceived,));

注意:需要重启项目才会生效

 

加载本地网页

String html =

    await rootBundle.loadString('assets/index.html');

String localHtmlFilePath = Uri.dataFromString(

  html,

  mimeType: 'text/html',

  encoding: Encoding.getByName('utf-8'),

).toString();

pubspec.yaml

  assets:

    - assets/index.html

使用

AppWebView(

  url: localHtmlFilePath,

   onMessageReceived: onMessageReceived,

)

上一篇:机房钥匙在哪里买到?

下一篇:高能英雄怎么切换服务器?