一个为flutter添加一些缺失的gtk4窗口功能的包。适用于linux,也适用于MacOS和Windows。之前: 之后:

特点

  • HeaderBar
    • 窗口命令按钮,如最大化、最小化和关闭
    • 当有可弹出的视图时,显示后退按钮
    • 浅色和深色模式

入门

要在Linux上开始使用:按如下方式编辑linux/my_application.cc文件

我们首先需要移除原生的标题栏。所以只需注释掉下面的代码

//gboolean use_header_bar = TRUE;
// #ifdef GDK_WINDOWING_X11
//   GdkScreen* screen = gtk_window_get_screen(window);
//   if (GDK_IS_X11_SCREEN(screen)) {
//     const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
//     if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
//       use_header_bar = FALSE;
//     }
//   }
// #endif
//   if (use_header_bar) {
//     GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
//     gtk_widget_show(GTK_WIDGET(header_bar));
//     gtk_header_bar_set_title(header_bar, "example");
//     gtk_header_bar_set_show_close_button(header_bar, TRUE);
//     gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
//   } else {
//     gtk_window_set_title(window, "example");
//   }

然后将这两行移到my_application_activate类的末尾,来自

gtk_window_set_default_size(window, 1280, 720);
//gtk_widget_show(GTK_WIDGET(window));

FlView* view = fl_view_new(project);
//gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));

to

static void my_application_activate(GApplication* application) {
...

gtk_widget_show(GTK_WIDGET(window));
gtk_widget_show(GTK_WIDGET(view));
}

用法

import 'package:gtk_window/gtk_window.dart';
Scaffold(
    appBar: GTKHeaderBar
        title: Text('example title'),
      ),
)

当前的局限性

  • 操作系统没有将应用栏原生化,因此在使用窗口管理器时无法隐藏它。

为什么不直接使用flutter提供的原生标题栏?

由于flutter团队维护着广泛支持的平台,他们必须将功能捆绑在一起以适应尽可能多的平台,从而简化开发。因此,他们将GTK应用栏版本做得与MacOS和Windows一样,因为它们只是悬停在内容之上,而没有太多控制权。在GTK中,应用栏可以包含许多小部件,而如果没有这个包,您将无法控制它们。

免责声明

我并不精通GTK本身,欢迎提出任何建议。

使用的插件

实际上,我没有为这个包编写任何特定于平台的代码。我依赖于handy_window和window_manager维护者的出色工作。

GitHub

查看 Github