Flutter桌面分屏插件desktop_split_pane的使用

Flutter桌面分屏插件desktop_split_pane的使用

desktop_split_pane

一个支持热重载的 Flutter 桌面和 Web 分屏组件。

特性

  • 支持热重载(不像旧版的 resizable_widget
  • 动画缩放
  • 应用窗口调整大小时自动缩放
  • 可以自定义分隔条厚度和颜色
  • 状态公开以便支持显式小部件重建(只需调用状态上的 rebuild() 方法)
  • 运行时可以移除和添加小部件而无需热重启
  • 此功能非常适合展示侧边栏并在以后隐藏它们
  • 添加了 onResize(widths/heights) 函数来监听缩放事件

开始使用

在项目中添加依赖:

flutter pub add desktop_split_pane

使用方法

以下是一个完整的示例,展示了如何使用 desktop_split_pane 插件创建一个水平和垂直分屏布局。

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

void main() {
  runApp(const App());
}

class App extends StatelessWidget {
  const App({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: LayoutBuilder(
          builder: (context, constraints) => HorizontalSplitPane(
            constraints: constraints,
            separatorColor: Colors.black,
            separatorThickness: 4.0,
            fractions: [0.2, 0.2, 0.2, 0.4],
            children: [
              Container(
                color: Colors.blue,
              ),
              Container(
                color: Colors.pinkAccent,
              ),
              Container(
                color: Colors.purpleAccent,
              ),
              VerticalSplitPane(
                constraints: constraints,
                separatorColor: Colors.white,
                separatorThickness: 4.0,
                children: [
                  Container(
                    color: Colors.grey,
                  ),
                  Container(
                    color: Colors.greenAccent,
                  ),
                  Container(
                    color: Colors.teal,
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

代码解析

  1. 导入库

    import 'package:desktop_split_pane/desktop_split_pane.dart';
    import 'package:flutter/material.dart';
    
  2. 主应用入口

    void main() {
      runApp(const App());
    }
    
  3. 构建MaterialApp

    class App extends StatelessWidget {
      const App({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: LayoutBuilder(
              builder: (context, constraints) => HorizontalSplitPane(
                constraints: constraints,
                separatorColor: Colors.black,
                separatorThickness: 4.0,
                fractions: [0.2, 0.2, 0.2, 0.4],
                children: [
                  // 子容器配置
                ],
              ),
            ),
          ),
        );
      }
    }
    
  4. 水平分屏

    HorizontalSplitPane(
      constraints: constraints,
      separatorColor: Colors.black,
      separatorThickness: 4.0,
      fractions: [0.2, 0.2, 0.2, 0.4],
      children: [
        Container(
          color: Colors.blue,
        ),
        Container(
          color: Colors.pinkAccent,
        ),
        Container(
          color: Colors.purpleAccent,
        ),
        VerticalSplitPane(
          constraints: constraints,
          separatorColor: Colors.white,
          separatorThickness: 4.0,
          children: [
            Container(
              color: Colors.grey,
            ),
            Container(
              color: Colors.greenAccent,
            ),
            Container(
              color: Colors.teal,
            ),
          ],
        ),
      ],
    )
    
  5. 垂直分屏

    VerticalSplitPane(
      constraints: constraints,
      separatorColor: Colors.white,
      separatorThickness: 4.0,
      children: [
        Container(
          color: Colors.grey,
        ),
        Container(
          color: Colors.greenAccent,
        ),
        Container(
          color: Colors.teal,
        ),
      ],
    )
    

更多关于Flutter桌面分屏插件desktop_split_pane的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter桌面分屏插件desktop_split_pane的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


desktop_split_pane 是一个用于 Flutter 桌面应用程序的插件,它允许你在应用程序中创建可调整大小的分屏布局。这个插件特别适合需要在同一窗口中显示多个视图的应用程序,例如代码编辑器、文件管理器或任何需要并排显示内容的场景。

安装

首先,你需要在 pubspec.yaml 文件中添加 desktop_split_pane 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  desktop_split_pane: ^0.1.0 # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

desktop_split_pane 提供了一个 SplitPane 组件,你可以使用它来创建分屏布局。以下是一个简单的示例,展示如何在 Flutter 桌面应用程序中使用 desktop_split_pane

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Desktop Split Pane Example'),
        ),
        body: SplitPane(
          initialWeights: [0.3, 0.7], // 设置初始分割比例
          children: [
            Container(
              color: Colors.blue,
              child: Center(child: Text('Left Pane')),
            ),
            Container(
              color: Colors.green,
              child: Center(child: Text('Right Pane')),
            ),
          ],
        ),
      ),
    );
  }
}

参数说明

  • initialWeights: 一个包含两个浮点数的列表,表示两个子组件的初始宽度比例。例如,[0.3, 0.7] 表示左侧占 30%,右侧占 70%。
  • children: 一个包含两个 Widget 的列表,分别表示左侧和右侧的内容。

自定义分隔条

你可以通过 divider 参数来自定义分隔条的样式。例如:

SplitPane(
  initialWeights: [0.3, 0.7],
  divider: Divider(color: Colors.red, thickness: 2.0),
  children: [
    Container(
      color: Colors.blue,
      child: Center(child: Text('Left Pane')),
    ),
    Container(
      color: Colors.green,
      child: Center(child: Text('Right Pane')),
    ),
  ],
)

响应式布局

SplitPane 可以与其他 Flutter 布局组件结合使用,以实现更复杂的布局。例如,你可以在 SplitPane 内部嵌套另一个 SplitPane,以实现多级分屏布局。

SplitPane(
  initialWeights: [0.3, 0.7],
  children: [
    SplitPane(
      initialWeights: [0.5, 0.5],
      axis: Axis.vertical, // 垂直分割
      children: [
        Container(
          color: Colors.blue,
          child: Center(child: Text('Top Left Pane')),
        ),
        Container(
          color: Colors.purple,
          child: Center(child: Text('Bottom Left Pane')),
        ),
      ],
    ),
    Container(
      color: Colors.green,
      child: Center(child: Text('Right Pane')),
    ),
  ],
)
回到顶部