123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import 'package:flutter/material.dart';
- import 'package:vnoteapp/components/floating_window/click_notification.dart';
- import 'package:vnoteapp/components/floating_window/floating_button.dart';
- import 'package:vnoteapp/components/floating_window/floating_item.dart';
- import 'package:vnoteapp/components/floating_window/floating_items.dart';
- import 'package:vnoteapp/components/floating_window/floating_window_model.dart';
- import 'package:vnoteapp/components/floating_window/floating_window_shared_data_widget.dart';
- /// [FloatingWindow] 悬浮窗
- class FloatingWindow extends StatefulWidget {
- const FloatingWindow({super.key});
- @override
- _FloatingWindowState createState() => _FloatingWindowState();
- }
- class _FloatingWindowState extends State<FloatingWindow> {
- List<Map<String, String>> ls = [
- {'title': "测试一下", "imageUrl": "assets/images/no_data.png"},
- ];
- /// 悬浮窗共享数据
- FloatingWindowModel? windowModel;
- /// [isEntering] 列表项是否拥有进场动画
- bool isEntering = true;
- @override
- void initState() {
- super.initState();
- windowModel = FloatingWindowModel(dataList: ls, isLeft: true);
- isEntering = true;
- }
- @override
- Widget build(BuildContext context) {
- return FloatingWindowSharedDataWidget(
- data: windowModel!,
- child: windowModel!.isEmpty
- ? Container()
- : Stack(
- fit: StackFit.expand,
- children: [
- /// 列表项遮盖层,增加淡化切换动画
- AnimatedSwitcher(
- duration: const Duration(milliseconds: 100),
- child: windowModel!.isButton
- ? Container()
- : GestureDetector(
- onTap: () {
- FloatingItem.reverse();
- Future.delayed(const Duration(milliseconds: 110),
- () {
- setState(() {
- windowModel!.isButton = true;
- });
- });
- },
- child: Container(
- decoration: const BoxDecoration(
- color: Color.fromRGBO(0xEF, 0xEF, 0xEF, 0.9)),
- ),
- ),
- ),
- NotificationListener<ClickNotification>(
- onNotification: (notification) {
- /// 列表项关闭事件
- if (notification.deletedIndex != -1) {
- windowModel?.deleteIndex = notification.deletedIndex;
- setState(() {
- FloatingItem.resetList();
- windowModel?.dataList
- .removeAt(notification.deletedIndex);
- isEntering = false;
- });
- }
- /// 列表点击事件
- if (notification.clickIndex != -1) {
- print(notification.clickIndex);
- }
- /// 悬浮按钮点击Widget改变事件
- if (notification.changeWidget) {
- setState(() {
- /// 释放列表进出场动画资源
- FloatingItem.resetList();
- windowModel?.isButton = false;
- isEntering = true;
- });
- }
- return false;
- },
- child: windowModel!.isButton
- ? const FloatingButton()
- : FloatingItems(
- isEntering: isEntering,
- ),
- )
- ],
- ),
- );
- }
- }
|