Flutter Linux WebView插件flutter_linux_webview的使用

Flutter Linux WebView插件flutter_linux_webview的使用

flutter_linux_webview 是一个为 webview_flutter (v3.0.4) 提供Linux桌面实现的插件,它使用CEF(Chromium Embedded Framework)来渲染WebView。以下是如何在Flutter项目中使用该插件的详细指南。

支持的平台

该插件已经在一些平台上进行了验证,但在其他平台上可能会出现挂起或崩溃的情况。具体可以查看 validation_report.md 文件了解不同平台上的验证结果。

运行示例项目

进入 example/ 目录并运行项目以查看实际效果。

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 flutter_linux_webviewwebview_flutter 作为依赖项:

dependencies:
  webview_flutter: ^3.0.4
  flutter_linux_webview: ^0.1.0

可以通过命令行添加这些依赖:

$ flutter pub add flutter_linux_webview:'^0.1.0'
$ flutter pub add webview_flutter:'^3.0.4'

2. 修改 linux/CMakeLists.txt

在你的应用的 linux/CMakeLists.txt 文件中添加以下命令:

include(flutter/ephemeral/.plugin_symlinks/flutter_linux_webview/linux/cmake/link_to_cef_library.cmake)

注意:此命令必须放在以下字符串之后:

add_executable(${BINARY_NAME})

如果未添加上述配置,插件将无法正常工作。

3. 导入并设置

在 Dart 代码中导入必要的包:

import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter_linux_webview/flutter_linux_webview.dart';

在创建第一个 WebView 之前,必须调用 LinuxWebViewPlugin.initialize() 方法,并且需要设置 WebView.platform = LinuxWebView(); 来配置 WebView 使用Linux实现。

以下是完整的示例代码:

import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter_linux_webview/flutter_linux_webview.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化插件
  LinuxWebViewPlugin.initialize(options: <String, String?>{
    'user-agent': 'UA String',
    'remote-debugging-port': '8888',
    'autoplay-policy': 'no-user-gesture-required',
  });

  // 配置WebView使用Linux实现
  WebView.platform = LinuxWebView();

  runApp(const MaterialApp(home: _WebViewExample()));
}

class _WebViewExample extends StatefulWidget {
  const _WebViewExample({Key? key}) : super(key: key);

  [@override](/user/override)
  _WebViewExampleState createState() => _WebViewExampleState();
}

class _WebViewExampleState extends State<_WebViewExample> with WidgetsBindingObserver {
  final Completer<WebViewController> _controller = Completer<WebViewController>();

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  Future<AppExitResponse> didRequestAppExit() async {
    await LinuxWebViewPlugin.terminate();
    return AppExitResponse.exit;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('flutter_linux_webview example'),
      ),
      body: WebView(
        initialUrl: 'https://flutter.dev',
        initialCookies: const [
          WebViewCookie(name: 'mycookie', value: 'foo', domain: 'flutter.dev')
        ],
        onWebViewCreated: (WebViewController webViewController) {
          _controller.complete(webViewController);
        },
        javascriptMode: JavascriptMode.unrestricted,
      ),
      floatingActionButton: favoriteButton(),
    );
  }

  Widget favoriteButton() {
    return FutureBuilder<WebViewController>(
      future: _controller.future,
      builder: (BuildContext context, AsyncSnapshot<WebViewController> controller) {
        if (controller.hasData) {
          return FloatingActionButton(
            onPressed: () async {
              final String useragent = await controller.data!.runJavascriptReturningResult('navigator.userAgent');
              final String title = await controller.data!.getTitle();
              final String url = await controller.data!.currentUrl();
              final String cookies = await controller.data!.runJavascriptReturningResult('document.cookie');
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text('userAgent: $useragent, title: $title, url: $url, cookie: $cookies'),
                ),
              );
            },
            child: const Icon(Icons.favorite),
          );
        }
        return Container();
      },
    );
  }
}

更多关于Flutter Linux WebView插件flutter_linux_webview的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Linux WebView插件flutter_linux_webview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter Linux应用中使用flutter_linux_webview插件的示例代码。这个示例展示了如何集成并使用WebView插件来加载一个网页。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_linux_webview依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_linux_webview: ^0.7.0  # 请检查最新版本号

2. 配置CMakeLists.txt

由于flutter_linux_webview依赖于原生代码,你需要在Linux项目的CMakeLists.txt文件中添加必要的配置。通常,这个文件位于linux目录下。

cmake_minimum_required(VERSION 3.10)

project(your_project_name LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# Flutter
set(FLUTTER_ROOT "${CMAKE_SOURCE_DIR}/../flutter")
find_package(Flutter REQUIRED)

# WebView
include_directories(${FLUTTER_ROOT}/bin/cache/pkg/sky_engine/include/dart_ui)

add_subdirectory(plugins/flutter_linux_webview)

add_executable(your_project_name main.cpp)

target_link_libraries(
    your_project_name
    PRIVATE FlutterEngine
    flutter_linux_webview
)

确保你的plugins目录下有一个flutter_linux_webview的符号链接,指向实际插件的位置。

3. 创建WebView页面

接下来,创建一个Flutter页面来使用WebView。首先,在lib目录下创建一个新的Dart文件,例如webview_page.dart

import 'package:flutter/material.dart';
import 'package:flutter_linux_webview/flutter_linux_webview.dart';

class WebViewPage extends StatefulWidget {
  final String url;

  WebViewPage({required this.url});

  @override
  _WebViewPageState createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  late WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WebView Example'),
      ),
      body: WebView(
        initialUrl: widget.url,
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;
        },
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

4. 使用WebView页面

最后,在你的主应用文件中(例如main.dart),使用刚才创建的WebViewPage

import 'package:flutter/material.dart';
import 'webview_page.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter WebView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter WebView Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => WebViewPage(url: 'https://www.example.com')),
              );
            },
            child: Text('Open WebView'),
          ),
        ),
      ),
    );
  }
}

5. 运行应用

确保你已经配置好Flutter开发环境,然后运行以下命令来构建和运行你的Flutter Linux应用:

flutter config --enable-linux-desktop
flutter run -d linux

这将启动你的Flutter应用,点击按钮后将会打开一个新的页面,其中包含一个加载了指定URL的WebView。

请根据实际情况调整代码中的项目名称和URL。希望这个示例对你有帮助!

回到顶部