Flutter PDF Viewer适用于Linux桌面

4
我正在使用Flutter开发一种具有PDF查看功能的聊天应用程序,适用于Android和Linux桌面平台。因此,我想要在flutter应用程序中嵌入PDF阅读器,使用某种PDF阅读器或WebBrowser。在Android上没有PDF方面的问题 - pub.dev上有100多个PDF和WebViews插件,但它们都不支持Linux桌面。我尝试为Android和IOS插件添加Linux桌面支持,但是似乎它们都使用PlatformView和webview_flutter类,这些类目前还不支持Linux桌面:webview_flutter PlatformView。它们的优先级为P4,并且没有指定里程碑。我不能等待无限长的时间,我必须在2个月内结束这个项目。那么我该怎么办呢?我了解到Flutter使用GTK+在Linux桌面上显示,我知道存在GTK+组件来显示PDF。是否可能在flutter ui中注入此组件?有任何示例吗?或者将PDF转换为jpeg并显示图像会更好吗?(但我不想失去缩放和文档导航)使用File.Open()打开PDF不是我的解决方案,因为在这种情况下,用户应该不断在flutter应用程序(其中我们有PDF文件列表)和PDF阅读器窗口之间切换。我对Flutter和Linux都很陌生,所以任何帮助都将不胜感激。
2个回答

2
所以,只是为了澄清我们如何使用Webkit实现这个目标,举个例子:

CMakeLists.txt:

#add webkit package reference
pkg_check_modules(WEBKIT2 REQUIRED IMPORTED_TARGET webkit2gtk-4.0)
...
#remove -Werror flag to allow compilation with warnings
target_compile_options(${TARGET} PRIVATE -Wall)
...
#link webkit libraries
target_link_libraries(${BINARY_NAME} PUBLIC PkgConfig::WEBKIT2) 
#somehow this line causes 'flutter run' to crash on "Linking CXX executable" step.
#Looks like it compiles, but fails to link. 
#I think there is should be other question opened for this issue. 

my_application.cc:

#include "my_application.h"
#include <flutter_linux/flutter_linux.h>
#include <webkit2/webkit2.h>
#include "flutter/generated_plugin_registrant.h"

static void my_application_activate(GApplication* application) {

  GtkWidget *vbox1 = gtk_vbox_new (FALSE, 0);
  gtk_widget_show (vbox1);

  // we can insert any gtk controls in this window outside of FlView
  GtkWidget *label = gtk_label_new ("Hello GNOME!");
  gtk_box_pack_start (GTK_BOX (vbox1), label, TRUE, TRUE, 2);
  gtk_widget_show (label);

  // webkit/poppler/evince should work perfect because they gtk+
  WebKitWebView *pWebKitView = WEBKIT_WEB_VIEW(webkit_web_view_new());
  gtk_box_pack_start (GTK_BOX (vbox1), GTK_WIDGET(pWebKitView), TRUE, TRUE, 2);
  gtk_widget_show(GTK_WIDGET(pWebKitView));

  // finally add FlView
  g_autoptr(FlDartProject) project = fl_dart_project_new();
  FlView *view = fl_view_new(project);
  gtk_box_pack_start (GTK_BOX (vbox1), GTK_WIDGET(view), TRUE, TRUE, 2);
  gtk_widget_show (GTK_WIDGET (view));

  GtkWindow* window =
  GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
  gtk_container_add (GTK_CONTAINER (window), vbox1);

  fl_register_plugins(FL_PLUGIN_REGISTRY(view));
  gtk_widget_grab_focus(GTK_WIDGET(view));

  GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
  gtk_widget_show(GTK_WIDGET(header_bar));
  gtk_header_bar_set_title(header_bar, "client");
  gtk_header_bar_set_show_close_button(header_bar, TRUE);
  gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
  gtk_window_set_default_size(window, 1280, 720);

  gtk_widget_show(GTK_WIDGET(window));
}

寻找在Flutter布局中嵌入GTK小部件的方法... - undefined

1
这个组件能否在Flutter UI中以某种方式注入呢?这正是PlatformView的作用,因此问题等同于PlatformView是否支持Linux。没有PlatformView支持的两个选项:1.在窗口中切换显示Flutter视图和PDF视图(如果您希望PDF填充窗口而显示)。2.将Flutter视图和PDF视图并排放置在窗口中(如果您希望同时看到Flutter内容-如文件列表-和PDF内容)。这两个选项都需要在本地代码中完成工作,因此您需要编写插件或直接在运行程序中实现,并使用方法通道协调Dart和本地代码之间的交互。

我想在一个窗口中将Flutter视图和PDF视图并排放置。我不想移动或调整这个窗口,它应始终处于全屏模式。在Linux Ubuntu上。我将尝试将两个GTK窗口合并在一起,这似乎是解决方案,谢谢。 - undefined
1
为什么要使用两个独立的窗口,而不是将两个视图并排放在同一个窗口中? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接