Flutter Linux 应用程序的 GTK+ 工具

license: MPL CI codecov

GtkSettings

GtkSettings 提供了一种在 Linux 上应用程序之间共享全局设置的机制。

screenshot

GtkApplication

GtkApplication 允许主要的 Flutter GTK 应用程序实例监听远程应用程序实例的命令行参数和文件打开请求。

注意: 必须修改 linux/my_application.cc 才能使此包正常运行。详情请参阅下面的“入门”。

gtk-application.webm

入门

linux/my_application.cc 应用以下更改

my_application_activate():如果存在,激活现有窗口

diff --git a/example/linux/my_application.cc b/example/linux/my_application.cc
index 5cd43c6..94e7215 100644
--- a/linux/my_application.cc
+++ b/linux/my_application.cc
@@ -20,6 +20,12 @@ static void my_application_activate(GApplication* application) {
   GtkWindow* window =
       GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
 
+  GList* windows = gtk_application_get_windows(GTK_APPLICATION(application));
+  if (windows) {
+    gtk_window_present(GTK_WINDOW(windows->data));
+    return;
+  }
+
   // Use a header bar when running in GNOME as this is the common style used
   // by applications and is the setup most users will be using (e.g. Ubuntu
   // desktop).
my_application_local_command_line():返回 FALSE 以允许包处理命令行

--- a/linux/my_application.cc
+++ b/linux/my_application.cc
@@ -81,7 +81,7 @@ static gboolean my_application_local_command_line(GApplication* application,
   g_application_activate(application);
   *exit_status = 0;
 
-  return TRUE;
+  return FALSE;
 }
 
 // Implements GObject::dispose.
my_application_new():将 G_APPLICATION_NON_UNIQUE 替换为 G_APPLICATION_HANDLES_COMMAND_LINEG_APPLICATION_HANDLES_OPEN 标志

--- a/linux/my_application.cc
+++ b/linux/my_application.cc
@@ -101,7 +101,8 @@ static void my_application_class_init(MyApplicationClass* klass) {
 static void my_application_init(MyApplication* self) {}
 
 MyApplication* my_application_new() {
-  return MY_APPLICATION(g_object_new(my_application_get_type(),
-                                     "application-id", APPLICATION_ID, "flags",
-                                     G_APPLICATION_NON_UNIQUE, nullptr));
+  return MY_APPLICATION(g_object_new(
+      my_application_get_type(), "application-id", APPLICATION_ID, "flags",
+      G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN,
+      nullptr));
 }

示例

GtkApplication 小部件允许在小部件树中监听来自远程应用程序实例的命令行参数和文件打开请求。

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

void main() {
  runApp(
    MaterialApp(
      home: GtkApplication(
        onCommandLine: (args) => print('command-line: $args'),
        onOpen: (files, hint) => print('open ($hint): $files'),
        child: // ...
      ),
    ),
  );
}

GtkApplicationNotifier 对象允许在小部件树外部监听来自远程应用程序实例的命令行参数和文件打开请求。

import 'package:flutter/widgets.dart';
import 'package:gtk_application/gtk_application.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  final notifier = GtkApplicationNotifier();
  notifier.addCommandLineListener((args) {
    print('command-line: $args');
  });
  notifier.addOpenListener((files, hint) {
    print('open ($hint): $files');
  });

  // ...
  // notifier.dispose();
}

GitHub

查看 Github