Flutter便签管理插件sticky_notes的使用

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

Flutter便签管理插件sticky_notes的使用

功能

sticky_notes 是一个Flutter插件,它允许你创建可以在其父容器边界内移动的便签。通过长按便签可以显示一个菜单,提供编辑、更改颜色和删除选项。单击便签会使便签变大,并启用对其子组件的缩放和平移功能。

Example usage

开始使用

要开始使用 sticky_notes 插件,请按照以下步骤操作:

  1. 添加依赖:在 pubspec.yaml 文件中添加 sticky_notes 作为依赖项。
  2. 创建 StickyNote 对象:将 StickyNote 对象放置在 Stack 小部件中。Stack 的边界就是便签的活动范围。

使用示例

以下是一个完整的示例代码,展示了如何使用 sticky_notes 插件创建多个可拖动的便签,并实现编辑、删除和颜色更改功能。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: StickyNotesTest(),
    );
  }
}

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

  [@override](/user/override)
  State<StickyNotesTest> createState() => _StickyNotesTestState();
}

class _StickyNotesTestState extends State<StickyNotesTest> {
  late TextEditingController notesTextController;

  String note1 = 'Test Note 1';

  List<StickyNote> stickyNotes = [];
  List<GlobalKey<StatefulWidget>> notesKeys = [
    GlobalKey(),
    GlobalKey(),
    GlobalKey()
  ];

  void setStickyNotes() {
    stickyNotes = [
      StickyNote(
        key: notesKeys[0],
        id: 1,
        width: 100,
        height: 100,
        // 长按时显示的颜色选项
        colorsEdit: const [
          Colors.green,
          Colors.yellow,
          Colors.orange,
          Colors.cyan
        ],
        // 处理编辑按钮事件,编辑文本
        onEdit: () async {
          notesTextController.text = note1;
          await showDialog(
              context: context,
              builder: ((context) {
                return AlertDialog(
                  title: const Text('Your note'),
                  icon: const Icon(Icons.note),
                  content: TextField(
                    controller: notesTextController,
                  ),
                );
              }));
          setState(() {
            note1 = notesTextController.text;
            setStickyNotes();
          });
        },
        // 处理删除按钮事件,从列表中删除便签
        onDelete: () {
          setState(() {
            onDeleteNote(1);
          });
        },
        child: Center(
          child: Text(
            note1,
            style: const TextStyle(
              fontSize: 12,
              color: Colors.black,
            ),
            textAlign: TextAlign.center,
          ),
        ),
      ),
      StickyNote(
        key: notesKeys[1],
        id: 2,
        width: 100,
        height: 100,
        colorsEdit: const [
          Colors.green,
          Colors.yellow,
          Colors.orange,
          Colors.cyan
        ],
        onDelete: () {
          setState(() {
            onDeleteNote(2);
          });
        },
        child: const FlutterLogo(
          size: 40,
        ),
      ),
      StickyNote(
        key: notesKeys[2],
        id: 3,
        width: 100,
        height: 100,
        colorsEdit: const [
          Colors.green,
          Colors.yellow,
          Colors.orange,
          Colors.cyan
        ],
        onDelete: () {
          setState(() {
            onDeleteNote(3);
          });
        },
        child: Image.network(
          'https://upload.wikimedia.org/wikipedia/commons/0/05/Cat.png',
          fit: BoxFit.fill,
        ),
      ),
    ];
  }

  [@override](/user/override)
  void initState() {
    notesTextController = TextEditingController();
    // 初始化便签列表,包含文本、图标和图片示例
    setStickyNotes();
    super.initState();
  }

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

  void onDeleteNote(int id) {
    setState(() {
      stickyNotes.removeWhere((element) => element.id == id);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          color: Colors.green,
          height: 500,
          width: 300,
          child: Stack(
            children: stickyNotes,
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用sticky_notes插件的示例代码。假设你已经在pubspec.yaml文件中添加了sticky_notes依赖,并且已经运行了flutter pub get来安装它。

pubspec.yaml

首先,确保你的pubspec.yaml文件中包含sticky_notes依赖:

dependencies:
  flutter:
    sdk: flutter
  sticky_notes: ^最新版本号  # 替换为实际发布的最新版本号

main.dart

接下来,在main.dart文件中,你可以按照以下方式使用sticky_notes插件来创建一个简单的便签管理应用。

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

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

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

class StickyNotesDemo extends StatefulWidget {
  @override
  _StickyNotesDemoState createState() => _StickyNotesDemoState();
}

class _StickyNotesDemoState extends State<StickyNotesDemo> {
  final StickyNotesController _stickyNotesController = StickyNotesController();

  @override
  void initState() {
    super.initState();
    // 监听便签变化
    _stickyNotesController.addListener(() {
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sticky Notes Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            Expanded(
              child: ListView.builder(
                itemCount: _stickyNotesController.notes.length,
                itemBuilder: (context, index) {
                  final note = _stickyNotesController.notes[index];
                  return ListTile(
                    title: Text(note.title),
                    subtitle: Text(note.content),
                    trailing: IconButton(
                      icon: Icon(Icons.delete),
                      onPressed: () {
                        _stickyNotesController.deleteNote(note.id);
                      },
                    ),
                  );
                },
              ),
            ),
            TextField(
              decoration: InputDecoration(
                labelText: 'New Note Title',
              ),
              onSubmitted: (title) {
                showDialog(
                  context: context,
                  builder: (context) {
                    return AlertDialog(
                      title: Text('Enter Note Content'),
                      content: TextField(
                        maxLines: 10,
                        decoration: InputDecoration(
                          labelText: 'Note Content',
                        ),
                        onSubmitted: (content) {
                          Navigator.of(context).pop();
                          _stickyNotesController.addNote(StickyNote(
                            id: UUID().v4(), // 假设你有一个生成UUID的方法
                            title: title,
                            content: content,
                          ));
                        },
                      ),
                      actions: [
                        TextButton(
                          onPressed: () {
                            Navigator.of(context).pop();
                          },
                          child: Text('Cancel'),
                        ),
                        TextButton(
                          onPressed: () {
                            // 这里自动提交content,因为TextField已经监听onSubmitted
                            Navigator.of(context).pop();
                          },
                          child: Text('Save'),
                        ),
                      ],
                    );
                  },
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

// 假设的UUID生成器,你需要一个实际的UUID库
class UUID {
  static String v4() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replaceAll(/[xy]/g, function(c) {
      var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
    });
  }
}

class StickyNote {
  final String id;
  final String title;
  final String content;

  StickyNote({required this.id, required this.title, required this.content});
}

说明

  1. 依赖安装:确保在pubspec.yaml中添加了sticky_notes依赖。
  2. 初始化控制器:在_StickyNotesDemoState中初始化StickyNotesController
  3. 监听变化:使用addListener来监听便签的变化,并调用setState来更新UI。
  4. UI构建:使用ListView.builder来展示便签列表,并提供删除功能。
  5. 添加便签:通过对话框来输入便签的标题和内容,并调用addNote方法添加到控制器中。

注意:sticky_notes插件的具体API和类可能有所不同,上面的代码是一个假设的示例,你可能需要根据实际的sticky_notes插件文档进行调整。特别是UUID的生成,你可能需要引入一个实际的UUID库,例如uuid_dart

回到顶部