Flutter布局插件pluto_layout的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter布局插件PlutoLayout的使用

PlutoLayout - v1.0.0

PlutoLayout 是一个 Flutter UI 包,可以在页面的各个方向配置菜单或标签页。你可以通过拖动标签页的右侧边框来调整其宽度。此外,你还可以为打开、关闭和调整标签页大小分配自定义快捷键。

PlutoLayout Screenshot

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  pluto_layout: ^1.0.0

然后运行 flutter pub get 来安装插件。

使用示例

以下是一个完整的示例代码,展示了如何使用 PlutoLayout 创建一个包含顶部、左侧、右侧和底部标签页的布局,并为其添加快捷键功能。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pluto_layout/pluto_layout.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData.dark(useMaterial3: true),
      home: const ExamplePage(),
    );
  }
}

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

  [@override](/user/override)
  State<ExamplePage> createState() => _ExamplePageState();
}

class _ExamplePageState extends State<ExamplePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: PlutoLayout(
        // 定义快捷键
        shortcuts: {
          LogicalKeySet(LogicalKeyboardKey.escape): 
            PlutoLayoutActions.hideAllTabView(),  // 按下 Esc 键隐藏所有标签页
          LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.digit1): 
            PlutoLayoutActions.rotateTabView(PlutoLayoutContainerDirection.left),  // Alt + 1 旋转左侧标签页
          LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.digit2): 
            PlutoLayoutActions.rotateTabView(PlutoLayoutContainerDirection.right),  // Alt + 2 旋转右侧标签页
          LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.arrowUp): 
            PlutoLayoutActions.increaseTabView(),  // Alt + 向上箭头 增加标签页大小
          LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.arrowDown): 
            PlutoLayoutActions.decreaseTabView(),  // Alt + 向下箭头 减小标签页大小
        },
        // 主体内容
        body: const PlutoLayoutContainer(
          child: Text('Body container'),  // 主体区域的内容
        ),
        // 顶部标签页
        top: PlutoLayoutContainer(
          child: PlutoLayoutTabs(
            items: [
              PlutoLayoutTabItem(
                id: 'top1',
                title: 'Top 1',  // 标签页标题
                tabViewBuilder: (e) => const Text('Top 1 Content'),  // 标签页内容
              ),
              PlutoLayoutTabItem(
                id: 'top2',
                title: 'Top 2',
                tabViewBuilder: (e) => const Text('Top 2 Content'),
              ),
            ],
          ),
        ),
        // 左侧标签页
        left: PlutoLayoutContainer(
          child: PlutoLayoutTabs(
            items: [
              PlutoLayoutTabItem(
                id: 'left1',
                title: 'Left 1',
                tabViewBuilder: (e) => const Text('Left 1 Content'),
              ),
              PlutoLayoutTabItem(
                id: 'left2',
                title: 'Left 2',
                tabViewBuilder: (e) => const Text('Left 2 Content'),
              ),
            ],
          ),
        ),
        // 右侧标签页
        right: PlutoLayoutContainer(
          child: PlutoLayoutTabs(
            items: [
              PlutoLayoutTabItem(
                id: 'right1',
                title: 'Right 1',
                tabViewBuilder: (e) => const Text('Right 1 Content'),
              ),
              PlutoLayoutTabItem(
                id: 'right2',
                title: 'Right 2',
                tabViewBuilder: (e) => const Text('Right 2 Content'),
              ),
            ],
          ),
        ),
        // 底部标签页
        bottom: PlutoLayoutContainer(
          child: PlutoLayoutTabs(
            items: [
              PlutoLayoutTabItem(
                id: 'bottom1',
                title: 'Bottom 1',
                tabViewBuilder: (e) => const Text('Bottom 1 Content'),
              ),
              PlutoLayoutTabItem(
                id: 'bottom2',
                title: 'Bottom 2',
                tabViewBuilder: (e) => const Text('Bottom 2 Content'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter布局插件pluto_layout的示例代码。pluto_layout是一个强大的布局插件,它允许你以声明式的方式创建复杂的网格布局。

首先,确保你已经在pubspec.yaml文件中添加了pluto_layout依赖:

dependencies:
  flutter:
    sdk: flutter
  pluto_layout: ^最新版本号  # 请替换为实际的最新版本号

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

以下是一个简单的示例,展示如何使用PlutoGrid创建一个基本的网格布局:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pluto Layout Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PlutoGridDemo(),
    );
  }
}

class PlutoGridDemo extends StatefulWidget {
  @override
  _PlutoGridDemoState createState() => _PlutoGridDemoState();
}

class _PlutoGridDemoState extends State<PlutoGridDemo> {
  late PlutoGridState gridState;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Pluto Grid Demo'),
      ),
      body: PlutoGrid(
        columns: _createColumns(),
        rows: _createRows(),
        onChanged: (PlutoGridOnChangedEvent event) {
          // 处理网格变化事件,例如数据更新等
          print(event);
        },
        onLoaded: (PlutoGridOnLoadedEvent event) {
          setState(() {
            gridState = event.state;
          });
        },
        gridState: gridState,
      ),
    );
  }

  List<PlutoColumn> _createColumns() {
    return [
      PlutoColumn(
        title: 'Name',
        field: 'name',
        type: PlutoColumnType.text(),
        width: 150,
        isEditable: true,
      ),
      PlutoColumn(
        title: 'Age',
        field: 'age',
        type: PlutoColumnType.number(),
        width: 100,
        isEditable: true,
      ),
    ];
  }

  List<PlutoRow> _createRows() {
    return [
      PlutoRow(
        cells: {
          'name': PlutoCell(value: 'Alice'),
          'age': PlutoCell(value: 30),
        },
      ),
      PlutoRow(
        cells: {
          'name': PlutoCell(value: 'Bob'),
          'age': PlutoCell(value: 25),
        },
      ),
    ];
  }
}

在这个示例中,我们创建了一个简单的网格布局,其中包含两列:“Name”和“Age”,以及两行数据。PlutoGrid组件负责渲染这个网格,并允许用户编辑单元格内容。

注意:

  • PlutoColumn定义了网格的列,包括标题、字段名、数据类型和宽度等信息。
  • PlutoRow定义了网格的行,其中cells是一个映射,键是列字段名,值是PlutoCell对象,表示该单元格的内容。
  • PlutoGrid组件接收columnsrows作为数据源,并提供了onChangedonLoaded回调函数来处理网格的变化和加载事件。

这只是一个基本的示例,pluto_layout提供了许多高级功能,例如排序、过滤、分组、分页等,你可以根据需要进一步探索和使用这些功能。

回到顶部