flutter windows应用程序如何设置窗口大小以及窗口配置 bitsdojo_window的使用

flutter bitsdojo_window 插件的使用

依赖安装

  • bitsdojo_window: 0.1.6
  • flutter pub get
    在这里插入图片描述

在主入口进行配置 main.dart

  • 如果只是配置窗口大小那只需要 配置 doWhenWindowReady(); 即可
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart'; //窗口插件
import './window_buttons.dart';

void main() async {
  // 在macOS必须配置当前代码
  WidgetsFlutterBinding.ensureInitialized();
  // WidgetsFlutterBinding.ensureInitialized(); 简单说就是主要处理原生flutter通信的,如果我们需要再main() 中做一些初始化操作就需要加上他 (windows上建议也加上)
  
  // 应用主页面
  runApp(const MyApp());

  // 配置窗口大小 bitsdojo_window 插件使用配置
  doWhenWindowReady(() {
    final win = appWindow;
    const initialSize = Size(800, 600); //配置尺寸
    win.minSize = initialSize; //软件的最小窗口
    win.size = initialSize; //默认的窗口大小
    // win.maxSize = const Size(900, 600); //最大窗口 一般不配置
    win.alignment = Alignment.center; //窗口的位置 启动的时候默认在什么方位
    win.title = 'Hello World';
    win.show(); //显示
  });
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        toolbarHeight: 30, //设置顶部导航条高度
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 配置可拖拽窗口区域
        title: WindowTitleBarBox(
          child: MoveWindow(),
        ),
        // 判断是否为 windows 环境 在macOS环境中无法生效 //import 'dart:io';
        actions: [if (Platform.isWindows == true) const WindowButtons()],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

修改应用顶部导航条

  • windows 中进行配置 \windows\runner\main.cpp 当前文件中添加如下代码

    // bitsdojo_window 插件使用配置
    #include <bitsdojo_window_windows/bitsdojo_window_plugin.h>
    auto bdw = bitsdojo_window_configure(BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP);
    

    在这里插入图片描述

  • macOS中进行配置 macos\runner\MainFlutterWindow.swift 当前文件中添加如下代码

    import Cocoa
    import FlutterMacOS
    import bitsdojo_window_macos
    
    class MainFlutterWindow: BitsdojoWindow  {
    
    override func bitsdojo_window_configure() -> UInt {
    // return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP 
    //去除BDW_HIDE_ON_STARTUP 否则打开应用的时候为隐藏状态
    return BDW_CUSTOM_FRAME
    }
    
    override func awakeFromNib() {
    let flutterViewController = FlutterViewController()
    let windowFrame = self.frame
    self.contentViewController = flutterViewController
    self.setFrame(windowFrame, display: true)
    
    RegisterGeneratedPlugins(registry: flutterViewController)
    
    super.awakeFromNib()
    }
    }
    
    

    在这里插入图片描述

在主入口进行配置 window_buttons.dart

// 配置windows应用窗口按钮
import 'package:flutter/material.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:flutter_multiterminal_demo/main%20copy%203.dart'; //窗口插件

// 快速生成 statefulW

class WindowButtons extends StatefulWidget {
  const WindowButtons({super.key});

  @override
  State<WindowButtons> createState() => _WindowButtonsState();
}

class _WindowButtonsState extends State<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 buttonColors = WindowButtonColors(
      // normal: Colors.grey[600],           //普通状态图标背景的颜色
      mouseOver: Colors.grey[400],        //鼠标到图标时的背景颜色
      mouseDown: Colors.grey[400],        //鼠标按下时的背景色
      iconNormal: Colors.grey[600],       //普通状态下按钮的颜色
      iconMouseOver: Colors.grey[600],    //鼠标移动到按钮图标时的图标颜色
      iconMouseDown: Colors.grey[600]);   //鼠标按下时按钮图标的颜色

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

  maximizeOrRestore() {
    appWindow.maximizeOrRestore();
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        // MouseRegion 鼠标放上去时 鼠标形状发生变化
        // MouseRegion(
        //   cursor: SystemMouseCursors.click,
        //   child: MinimizeWindowButton(
        //     colors: buttonColors,
        //   ),
        // ),
        MinimizeWindowButton(),
        MouseRegion(
            cursor: SystemMouseCursors.click,
            child: appWindow.isMaximized
                ? RestoreWindowButton(
                    colors: buttonColors,
                    // onPressed 按压事件
                    onPressed: maximizeOrRestore,
                  )
                : MaximizeWindowButton(
                    colors: buttonColors,
                    onPressed: maximizeOrRestore,
                  )),
        MouseRegion(
          cursor: SystemMouseCursors.click,
          child: CloseWindowButton(
            colors: closeButtonColors,
          ),
        ),
      ],
    );
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值