Webview Flutter

️ Project moved to new repository

A Aurora OS implementation for the webview_flutter plugin, powered by Aurora OS webview library. Part of this plugin using code from this project flutter_linux_webview.

Aurora OS supported versions: >=5.1.3

Usage

You have to include webview_flutter as dependencies in your pubspec.yaml file.

pubspec.yaml

  webview_flutter: ^4.10.0

main.cpp

#include <QGuiApplication>
#include <QtGlobal>

#include <auroraapp.h>

#include <flutter/flutter_aurora.h>
#include <flutter/flutter_compatibility_qt.h>  // <- Add for Qt

#include <webview_flutter_aurora/webview_flutter_aurora_plugin.h>

#include "generated_plugin_registrant.h"

int ProcessQtEvents(void* app) {
  static_cast<QGuiApplication*>(app)->processEvents();
  return G_SOURCE_CONTINUE;
}

int main(int argc, char* argv[]) {
  WebviewFlutterAuroraPlugin::StartProcess(argc, argv, WEBVIEW_SUBPROCESS_LAUNCHER_INSTALL_PATH);
  WebviewFlutterAuroraPlugin::InitQCA();

  aurora::Initialize(argc, argv);

  auto* app = Aurora::Application::application(argc, argv);
  app->setOrganizationName("ru.auroraos");
  app->setApplicationName("webview_example");

  GSource* source = g_timeout_source_new(150);
  g_source_set_priority(source, G_PRIORITY_LOW);
  g_source_set_callback(source, ProcessQtEvents, app, nullptr);

  aurora::AttachEventSource(source);
  aurora::RegisterPlugins();
  aurora::Launch();

  return 0;
}

*.spec

%include %{_sourcedir}/defines.inc

%global __provides_exclude_from ^%{_datadir}/%{name}/lib/.*$
%global __requires_exclude %{_flutter_excludes}

Name: %{orgName}.%{appName}%{?flavor}
Summary: Demonstrates how to use the webview_flutter plugin.
Version: %{appVersion}
Release: 1
License: Proprietary
Source0: %{name}-%{version}.tar.zst

%requires
%dnl Place to add custom BuildRequires.

%global webview_launcher %{_libexecdir}/%{name}/ru.auroraos.webview-subprocess-launcher

%description
%{summary}.

%prep
%autosetup

%build
%cmake -GNinja \
       -DCMAKE_BUILD_TYPE=%{_flutter_build_type} \
       -DPSDK_VERSION=%{_flutter_psdk_version} \
       -DPSDK_MAJOR=%{_flutter_psdk_major} \
       -DWEBVIEW_SUBPROCESS_LAUNCHER_INSTALL_PATH=%{webview_launcher} \
       -DFLUTTER_PROJECT_NAME=%{name}
%ninja_build

%install
%ninja_install
mkdir -p %{buildroot}/%{_libexecdir}/%{name} && \
  mv %{buildroot}%{_libexecdir}/ru.auroraos.webview-subprocess-launcher %{buildroot}/%{webview_launcher} && \
  chmod +x %{buildroot}/%{webview_launcher} && \
  patchelf --set-rpath %{_datadir}/%{name}/lib %{buildroot}/%{webview_launcher}

%files
%{_bindir}/%{name}
%{webview_launcher}
%{_datadir}/%{name}/*
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/%{name}.png

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(${FLUTTER_PROJECT_NAME} LANGUAGES CXX)

include(GNUInstallDirs)

find_package(PkgConfig REQUIRED)
find_package(Qt5 COMPONENTS Core Gui Quick REQUIRED)

pkg_check_modules(auroraapp REQUIRED auroraapp IMPORTED_TARGET auroraapp)

set(BINARY_NAME ${CMAKE_PROJECT_NAME})
set(FLUTTER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/flutter)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_CXX_FLAGS "-Wall -Wextra")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

set(CMAKE_SKIP_RPATH OFF)
set(CMAKE_INSTALL_RPATH
    "\$ORIGIN/../share/${BINARY_NAME}/lib;${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}/lib;"
)

add_executable(${BINARY_NAME} main.cpp)

include(flutter/generated_plugins.cmake)

target_include_directories(
    ${BINARY_NAME}
    PRIVATE ${FLUTTER_DIR}
            ${Qt5Core_INCLUDE_DIRS}
            ${Qt5Gui_INCLUDE_DIRS}
            ${auroraapp_INCLUDE_DIRS})

get_property(CEF_LINK_PROPERTY GLOBAL PROPERTY "CEF_LINK_PROPERTY")
target_link_options(${BINARY_NAME} PRIVATE ${CEF_LINK_PROPERTY})

target_link_libraries(${BINARY_NAME} PRIVATE
    PkgConfig::auroraapp
    Qt5::Core
    Qt5::Gui
    aurora_embedder::aurora_embedder
)

add_compile_definitions(WEBVIEW_SUBPROCESS_LAUNCHER_INSTALL_PATH="${WEBVIEW_SUBPROCESS_LAUNCHER_INSTALL_PATH}")

set(PACKAGE_INSTALL_DIR    ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
set(DESKTOP_INSTALL_DIR    ${CMAKE_INSTALL_DATADIR}/applications)
set(ICONS_INSTALL_ROOT_DIR ${CMAKE_INSTALL_DATADIR}/icons/hicolor)

install(FILES     ${PROJECT_BINARY_DIR}/bundle/icudtl.dat     DESTINATION ${PACKAGE_INSTALL_DIR})
install(DIRECTORY ${PROJECT_BINARY_DIR}/bundle/flutter_assets DESTINATION ${PACKAGE_INSTALL_DIR})
install(DIRECTORY ${PROJECT_BINARY_DIR}/bundle/lib            DESTINATION ${PACKAGE_INSTALL_DIR})

install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES desktop/${BINARY_NAME}.desktop DESTINATION ${DESKTOP_INSTALL_DIR})

foreach(ICONS_SIZE 86x86 108x108 128x128 172x172)
    install(FILES icons/${ICONS_SIZE}.png
            RENAME ${BINARY_NAME}.png
            DESTINATION ${ICONS_INSTALL_ROOT_DIR}/${ICONS_SIZE}/apps/)
endforeach(ICONS_SIZE)

main.dart

// Import webview
import 'package:webview_flutter/webview_flutter.dart';

// Use widget

final PlatformWebViewControllerCreationParams params
  = const PlatformWebViewControllerCreationParams();

final WebViewController controller =
    WebViewController.fromPlatformCreationParams(params);


WebViewWidget(controller: controller);