Flutter分屏布局插件split_pane的使用

Flutter分屏布局插件split_pane的使用

split_pane 是一个用于实现 Material Design 分屏布局的 Flutter 插件。通过该插件,开发者可以轻松地创建具有固定或灵活布局的分屏组件。

特性

  • 固定布局
  • 灵活布局
  • 指定规格的动画(不支持)
  • 无障碍功能(不支持)
  • 相对于自定义中心/显示特性的灵活布局(不支持)
  • API 质量(主题、继承数据等)(不支持)

使用方法

以下是一个简单的示例,展示了如何使用 split_pane 插件来创建一个基本的分屏布局。

import 'package:split_pane/split_pane.dart';

Widget build(BuildContext context) {
  return SplitPane(
    primary: Placeholder(), // 主面板
    secondary: Placeholder(), // 辅助面板
  );
}

完整示例

下面是一个更完整的示例,展示了如何使用 split_pane 插件来创建一个具有旋转按钮和切换面板位置功能的分屏布局。

import 'package:example/pane.dart';
import 'package:example/rotate_button.dart';
import 'package:example/switch_pane_button.dart';
import 'package:example/theme.dart';
import 'package:flutter/material.dart';
import 'package:split_pane/split_pane.dart';

void main() => runApp(const ExampleApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: theme,
      home: HomePage(),
      debugShowCheckedModeBanner: false,
    );
  }
}

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

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {
  late final SplitController _controller;
  Axis _direction = Axis.horizontal;
  PaneLocation _paneLocation = PaneLocation.trailing;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller = SplitController(vsync: this);
  }

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
        child: ListenableBuilder(
          listenable: _controller,
          builder: (context, _) {
            return SplitPane(
              controller: _controller,
              direction: _direction,
              primaryPaneLocation: _paneLocation,
              primary: Pane(
                child: Center(
                  child: Row(
                    mainAxisSize: MainAxisSize.min,
                    spacing: 8.0,
                    children: [
                      RotateButton(onPressed: _onRotate), // 旋转按钮
                      SwitchPaneButton(
                        paneLocation: _paneLocation,
                        direction: _direction,
                        onPressed: _onSwitchPane, // 切换面板按钮
                      ),
                    ],
                  ),
                ),
              ),
              secondary: ClipRect(
                child: Pane(
                  child: Center(
                    child: Text(sizeAsString), // 显示当前尺寸
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }

  void _onRotate() {
    setState(() => _direction =
        _direction == Axis.horizontal ? Axis.vertical : Axis.horizontal); // 切换方向
  }

  String get sizeAsString {
    final position = _controller.position;
    if (_controller.isAbsolute) {
      final dp = position.toStringAsFixed(0);
      return '$dp dp';
    } else {
      final percent = (position * 100).toStringAsFixed(0);
      return '$percent%';
    }
  }

  void _onSwitchPane() {
    setState(() {
      _paneLocation = switch (_paneLocation) {
        PaneLocation.leading => PaneLocation.trailing,
        PaneLocation.trailing => PaneLocation.leading,
      };
    });
  }
}

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

1 回复

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


split_pane 是一个用于 Flutter 的分屏布局插件,它允许你在应用中创建可拖动的分隔栏,从而将界面分成多个可调整大小的区域。这个插件非常适合需要同时显示多个视图或面板的应用场景,例如代码编辑器、文件管理工具等。

安装

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

dependencies:
  flutter:
    sdk: flutter
  split_pane: ^0.2.0  # 请检查最新版本

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

基本用法

split_pane 插件提供了 SplitPane 小部件,你可以通过它来创建分屏布局。以下是一个简单的示例,展示如何使用 SplitPane 将屏幕分成左右两个部分:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SplitPaneExample(),
    );
  }
}

class SplitPaneExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Split Pane Example'),
      ),
      body: SplitPane(
        initialWeights: [0.3, 0.7], // 初始权重,左右比例为3:7
        children: [
          Container(
            color: Colors.blue,
            child: Center(child: Text('Left Pane')),
          ),
          Container(
            color: Colors.green,
            child: Center(child: Text('Right Pane')),
          ),
        ],
      ),
    );
  }
}

参数说明

  • initialWeights: 一个包含两个元素的列表,表示左右两个区域的初始权重。总和应为 1.0。
  • children: 一个包含两个子部件的列表,分别代表左右两个区域的内容。
  • dividerColor: 分隔栏的颜色。
  • dividerSize: 分隔栏的宽度或高度(取决于方向)。
  • orientation: 分屏的方向,可以是 Axis.horizontal(水平分屏)或 Axis.vertical(垂直分屏)。

垂直分屏示例

如果你想创建垂直分屏布局,只需将 orientation 参数设置为 Axis.vertical

SplitPane(
  orientation: Axis.vertical,
  initialWeights: [0.4, 0.6], // 初始权重,上下比例为4:6
  children: [
    Container(
      color: Colors.red,
      child: Center(child: Text('Top Pane')),
    ),
    Container(
      color: Colors.yellow,
      child: Center(child: Text('Bottom Pane')),
    ),
  ],
)

自定义分隔栏

你可以通过 dividerColordividerSize 参数来自定义分隔栏的外观:

SplitPane(
  dividerColor: Colors.black,
  dividerSize: 10.0,
  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')),
    ),
  ],
)
回到顶部