搜索插件、代码仓与 APP 分类

bitsdojo_window 封面
插件详情v0.1.6

bitsdojo_window

一个用于帮助在 Flutter 桌面端创建自定义窗口(自定义边框、标题栏以及最小化/最大化/关闭按钮)和常见桌面窗口操作(显示/隐藏/屏幕位置)的包,适用于 Windows 和 macOS

macOSWindowsLinux
近 30 天下载
2.9万
喜欢数
1060
Pub 分数
120

安装插件

flutter pub add bitsdojo_window

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

bitsdojo_window 是一个用于在 Windows、macOS 和 Linux 上构建自定义桌面窗口的 Flutter 包。它使开发者能够创建具有自定义边框、标题栏和控制按钮(最小化、最大化、关闭)的视觉上独特的窗口。该包支持显示、隐藏和定位窗口等基本窗口操作。非常适合需要跨桌面平台实现原生体验且高度可定制的用户界面的应用程序。

适合场景

  • 桌面应用程序的自定义窗口设计
  • 创建品牌化或独特的用户界面
  • 实现自定义标题栏
  • 管理窗口可见性和位置
  • 跨平台桌面应用程序开发

主要特点

  • 自定义窗口边框和标题栏
  • 内置的最小化/最大化/关闭按钮
  • 窗口显示/隐藏和定位
  • 支持 Windows、macOS 和 Linux
  • 与Flutter桌面应用轻松集成

适合对象

  • 开发桌面优先的 Flutter 应用程序的开发者
  • 希望完全控制窗口外观的设计人员
  • 需要跨平台桌面兼容性的应用
  • 创建精美桌面用户体验的团队

使用建议

  • 需要 Flutter 桌面设置
  • 超出所提供控件的定制选项有限
  • 可能需要平台特定的样式调整
  • 不适用于移动或网页平台

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Pub Version Pub Popularity Pub Points

GitHub Stars Build Test GitHub License

bitsdojo_window

A Flutter package that makes it easy to customize and work with your Flutter desktop app window on Windows, macOS and Linux.

Watch the tutorial to get started. Click the image below to watch the video:

IMAGE ALT TEXT

Features:

  • Custom window frame - remove standard Windows/macOS/Linux titlebar and buttons
  • Hide window on startup
  • Show/hide window
  • Move window using Flutter widget
  • Minimize/Maximize/Restore/Close window
  • Set window size, minimum size and maximum size
  • Set window position
  • Set window alignment on screen (center/topLeft/topRight/bottomLeft/bottomRight)
  • Set window title

Getting Started

Add the package to your project's pubspec.yaml file manually or using the command below:

pub add bitsdojo_window

The pubspec.yaml file should look like this:

// pubspec.yaml

  ...

  dependencies:
    flutter:
      sdk: flutter
+ bitsdojo_window: ^0.1.6

  dev_dependencies:

  ...

For Windows apps

Inside your application folder, go to windows\runner\main.cpp and change the code look like this:

// windows/runner/main.cpp

  ...

  #include "flutter_window.h"
  #include "utils.h"

+ #include <bitsdojo_window_windows/bitsdojo_window_plugin.h>
+ auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP);

  int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,

  ...

For macOS apps

Inside your application folder, go to macos\runner\MainFlutterWindow.swift and change the code look like this:

// macos/runner/MainFlutterWindow.swift

  import Cocoa
  import FlutterMacOS
+ import bitsdojo_window_macos

- class MainFlutterWindow: NSWindow {
+ class MainFlutterWindow: BitsdojoWindow {
+     override func bitsdojo_window_configure() -> UInt {
+     return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
+   }
      override func awakeFromNib() {

      ...

    }
  }

If you don't want to use a custom frame and prefer the standard window titlebar and buttons, you can remove the BDW_CUSTOM_FRAME flag from the code above.

If you don't want to hide the window on startup, you can remove the BDW_HIDE_ON_STARTUP flag from the code above.

For Linux apps

Inside your application folder, go to linux\my_application.cc and change the code look like this:

// linux/my_application.cc

  ...
  #include "flutter/generated_plugin_registrant.h"
+ #include <bitsdojo_window_linux/bitsdojo_window_plugin.h>

  struct _MyApplication {

  ...

  }

+  auto bdw = bitsdojo_window_from(window);
+  bdw->setCustomFrame(true);
-  gtk_window_set_default_size(window, 1280, 720);
   gtk_widget_show(GTK_WIDGET(window));

   g_autoptr(FlDartProject) project = fl_dart_project_new();

  ...

  }

Flutter app integration

Now go to lib\main.dart and change the code look like this:

// lib/main.dart

  import 'package:flutter/material.dart';
+ import 'package:bitsdojo_window/bitsdojo_window.dart';

 void main() {
   runApp(MyApp());

+   doWhenWindowReady(() {
+     const initialSize = Size(600, 450);
+     appWindow.minSize = initialSize;
+     appWindow.size = initialSize;
+     appWindow.alignment = Alignment.center;
+     appWindow.show();
+   });
 }

This will set an initial size and a minimum size for your application window, center it on the screen and show it on the screen.

You can find examples in the example folder.

Here is an example that displays this window:

Click to expand
import 'package:flutter/material.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';

void main() {
  runApp(const MyApp());
  doWhenWindowReady(() {
    final win = appWindow;
    const initialSize = Size(600, 450);
    win.minSize = initialSize;
    win.size = initialSize;
    win.alignment = Alignment.center;
    win.title = "Custom window with Flutter";
    win.show();
  });
}

const borderColor = Color(0xFF805306);

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: WindowBorder(
          color: borderColor,
          width: 1,
          child: Row(
            children: const [LeftSide(), RightSide()],
          ),
        ),
      ),
    );
  }
}

const sidebarColor = Color(0xFFF6A00C);

class LeftSide extends StatelessWidget {
  const LeftSide({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return SizedBox(
        width: 200,
        child: Container(
            color: sidebarColor,
            child: Column(
              children: [
                WindowTitleBarBox(child: MoveWindow()),
                Expanded(child: Container())
              ],
            )));
  }
}

const backgroundStartColor = Color(0xFFFFD500);
const backgroundEndColor = Color(0xFFF6A00C);

class RightSide extends StatelessWidget {
  const RightSide({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: Container(
        decoration: const BoxDecoration(
          gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: [backgroundStartColor, backgroundEndColor],
              stops: [0.0, 1.0]),
        ),
        child: Column(children: [
          WindowTitleBarBox(
            child: Row(
              children: [Expanded(child: MoveWindow()), const WindowButtons()],
            ),
          )
        ]),
      ),
    );
  }
}

final buttonColors = WindowButtonColors(
    iconNormal: const Color(0xFF805306),
    mouseOver: const Color(0xFFF6A00C),
    mouseDown: const Color(0xFF805306),
    iconMouseOver: const Color(0xFF805306),
    iconMouseDown: const Color(0xFFFFD500));

final closeButtonColors = WindowButtonColors(
    mouseOver: const Color(0xFFD32F2F),
    mouseDown: const Color(0xFFB71C1C),
    iconNormal: const Color(0xFF805306),
    iconMouseOver: Colors.white);

class WindowButtons extends StatelessWidget {
  const WindowButtons({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        MinimizeWindowButton(colors: buttonColors),
        MaximizeWindowButton(colors: buttonColors),
        CloseWindowButton(colors: closeButtonColors),
      ],
    );
  }
}

Want to help? Become a sponsor

I am developing this package in my spare time and any help is appreciated.

If you want to help you can become a sponsor.

🙏 Thank you!

☕️ Current sponsors:

No sponsors

所属分类

依赖

依赖清单 4 项

  • bitsdojo_window_linux^0.1.4
  • bitsdojo_window_macos^0.1.4
  • bitsdojo_window_platform_interface^0.1.2
  • bitsdojo_window_windows^0.1.6

源码仓库

使用此插件的项目