一个为flutter添加一些缺失的gtk4窗口功能的包。适用于linux,也适用于MacOS和Windows。之前:
之后: 
特点
入门
要在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维护者的出色工作。

