Flutter看板视图插件flutter_boardview_kanban的使用

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

Flutter看板视图插件flutter_boardview_kanban的使用

简介

flutter_boardview 是一个强大的自定义小部件,能够创建类似 Trello 或 Jira 接口的可拖动看板。这种灵活的看板视图允许用户通过直观的拖放功能轻松重新排列和管理项目。通过此组件,您可以创建、重新排列和自定义列,从而在您的应用程序中提供动态且灵活的仪表盘体验。

源项目

安装

只需将 flutter_boardview 添加到 pubspec.yaml 文件中:

dependencies:
  flutter_boardview: ^x.y.z

然后运行 flutter pub get

使用示例

要开始使用,可以查看 /example 文件夹中的示例。该包分为三个核心部分:

简单看板

示例

无限滚动列

在示例中,我们使用了 https://pub.dev/packages/infinite_scroll_pagination 来实现无限滚动列表:

示例

BoardView

BoardView 类接受一个 BoardList 列表。它还可以接受一个 BoardViewController,可用于在 BoardView 中动画到特定位置。

// 创建一个 BoardViewController 实例
BoardViewController boardViewController = BoardViewController();

// 初始化一个空的 BoardList 列表
List<BoardList> _lists = List<BoardList>();

// 使用 BoardView 构建界面
BoardView(
  lists: _lists,
  boardViewController: boardViewController,
);

BoardList

BoardList 包含多个回调方法,当其被拖动时会触发。头部项是一个 Row,并期望一个列表。

BoardList(
  // 开始拖动列表时的回调
  onStartDragList: (int listIndex) {
    // 在这里处理逻辑
  },
  // 点击列表时的回调
  onTapList: (int listIndex) async {
    // 在这里处理逻辑
  },
  // 列表拖放到新位置时的回调
  onDropList: (int listIndex, int oldListIndex) {       
    // 在这里处理逻辑
  },
  // 设置头部背景颜色
  headerBackgroundColor: Color.fromARGB(255, 235, 236, 240),
  // 设置背景颜色
  backgroundColor: Color.fromARGB(255, 235, 236, 240),
  // 设置头部内容
  header: [
    Expanded(
        child: Padding(
            padding: EdgeInsets.all(5),
            child: Text(
              "List Item",
              style: TextStyle(fontSize: 20),
            ))),
  ],
  // 设置列表项
  items: items,
);

BoardItem

BoardItem 视图包含多个回调方法,当拖动时会被调用。长按项目字段小部件将开始拖动过程。

BoardItem(
  // 开始拖动项目时的回调
  onStartDragItem: (int listIndex, int itemIndex, BoardItemState state) {
    // 在这里处理逻辑
  },
  // 项目拖放到新位置时的回调
  onDropItem: (int listIndex, int itemIndex, int oldListIndex, int oldItemIndex, BoardItemState state) {
    // 在这里处理逻辑
  },
  // 点击项目时的回调
  onTapItem: (int listIndex, int itemIndex, BoardItemState state) async {
    // 在这里处理逻辑
  },
  // 设置项目内容
  item: Card(
    child: Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text("Board Item"),
    ),
  )
);

完整示例

以下是完整的示例代码,展示了如何使用 flutter_boardview 插件创建一个简单的看板应用。

// example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter_boardview/flutter_boardview.dart'; // 导入必要的库

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter BoardView Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Tab> tabs = [
    Tab("Board", const ExampleBoard(), const Icon(Icons.table_chart)),
    Tab("Pagination (infinite scroll)", const PaginationScrollBoard(), const Icon(Icons.list_alt_outlined)),
  ];

  int _selectedIndex = 0;
  late final List<Widget> _widgetOptions = tabs.map((Tab tab) => tab.widget).toList();

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(tabs[_selectedIndex].label)),
      body: _widgetOptions.elementAt(_selectedIndex),
      bottomNavigationBar: BottomNavigationBar(
        items: tabs
            .map((Tab tab) => BottomNavigationBarItem(
                  icon: tab.icon,
                  label: tab.label,
                ))
            .toList(),
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
      ),
    );
  }
}

class Tab {
  final String label;
  final Widget widget;
  final Widget icon;

  Tab(this.label, this.widget, this.icon);
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用flutter_boardview_kanban插件来实现看板视图(Kanban View)的代码示例。这个插件可以帮助你快速创建一个可拖动的看板界面,适用于任务管理、项目管理等应用场景。

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

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

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

接下来,在你的Flutter项目中,你可以按照以下步骤来创建一个简单的看板视图:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Kanban Board Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: KanbanBoardScreen(),
    );
  }
}

class KanbanBoardScreen extends StatefulWidget {
  @override
  _KanbanBoardScreenState createState() => _KanbanBoardScreenState();
}

class _KanbanBoardScreenState extends State<KanbanBoardScreen> {
  List<Board> boards = [
    Board(
      title: 'To Do',
      color: Colors.blue,
      cards: [
        Card(
          title: 'Task 1',
          color: Colors.lightBlue,
        ),
        Card(
          title: 'Task 2',
          color: Colors.lightBlueAccent,
        ),
      ],
    ),
    Board(
      title: 'In Progress',
      color: Colors.green,
      cards: [
        Card(
          title: 'Task 3',
          color: Colors.lightGreen,
        ),
      ],
    ),
    Board(
      title: 'Done',
      color: Colors.grey,
      cards: [],
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Kanban Board'),
      ),
      body: KanbanBoard(
        boards: boards,
        onCardDrag: (Card card, Board fromBoard, Board toBoard) {
          setState(() {
            fromBoard.cards.remove(card);
            toBoard.cards.add(card);
          });
        },
      ),
    );
  }
}

class Board {
  String title;
  Color color;
  List<Card> cards;

  Board({required this.title, required this.color, required this.cards});
}

class Card {
  String title;
  Color color;

  Card({required this.title, required this.color});
}

代码说明:

  1. 依赖添加:在pubspec.yaml文件中添加flutter_boardview_kanban依赖。

  2. 主应用MyApp是一个简单的MaterialApp,它包含一个标题和主题,并设置KanbanBoardScreen作为首页。

  3. 看板屏幕KanbanBoardScreen是一个StatefulWidget,它包含一个状态boards,这个状态包含了三个看板(To Do、In Progress、Done)和它们各自的卡片。

  4. 看板数据模型BoardCard是两个简单的数据模型,分别表示看板和卡片。

  5. KanbanBoard:使用KanbanBoard组件来渲染看板视图,并通过onCardDrag回调来处理卡片的拖动事件。在拖动事件发生时,卡片从源看板移除并添加到目标看板。

这个示例展示了如何使用flutter_boardview_kanban插件来创建一个基本的看板视图,并允许用户拖动卡片在不同的看板之间移动。你可以根据需要进一步自定义和扩展这个示例。

回到顶部