Flutter:滑动删除

使用flutter_slidable: ^4.0.3完成滑动删除效果

dart 复制代码
import 'package:demo/common/index.dart';
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:demo/pages/web3/assets/token_list/index.dart';
import 'package:demo/pages/web3/manage/wallet_list/index.dart';
import 'index.dart';


class HomePage extends GetView<HomeController> {
  const HomePage({super.key});

  // 资产列表
  Widget _buildAssetList() {
    return SliverList(
      delegate: SliverChildBuilderDelegate(
        (context, index) {
          return _buildAssetItem(index);
        },
        childCount: controller.assetList.length,
      ),
    );
  }

  // 资产item(使用 Slidable 实现右滑删除)✅
  Widget _buildAssetItem(int index) {
    final asset = controller.assetList[index];
    
    return Slidable(
      // 唯一标识(必须)
      key: Key('asset_${asset['id']}'),
      // 分组标签:同一组内的 Slidable 互斥,同时只能打开一个 ✅
      groupTag: 'asset_list',
      // 结束操作面板(从右向左滑动显示)
      endActionPane: ActionPane(
        // 滑动动画
        motion: const ScrollMotion(),
        // 控制滑动距离(0.0-1.0,0.2 表示滑动 20% 的宽度)✅
        // 可以根据需要调整这个值来控制删除按钮显示的距离
        extentRatio: 0.2,
        // 删除按钮
        children: [
          CustomSlidableAction(
            flex: 1,
            backgroundColor: Colors.red,
            onPressed: (context) async {
              controller.deleteAsset(index);
            },
            child: Container(
              alignment: Alignment.center,
              child: const Icon(
                Icons.delete,
                color: Colors.white,
                size: 28,
              ),
            ),
          ),
        ],
      ),
      // 子组件(资产项内容)
      child: <Widget>[
        // 代币信息
        ImgWidget(
            path: 'assets/web3/bnb_ac.png',
            width: 70.w,
            height: 70.w,
          ).marginOnly(right: 20.w),
        <Widget>[
          <Widget>[
            TextWidget.body(asset['symbol'] ?? '',size: 16,weight: FontWeight.w600),
            SizedBox(height: 10.w),
            <Widget>[
              const TextWidget.body('\$0',size: 12,color: AppTheme.color666,),
              const SizedBox(width: 10),
              const TextWidget.body('0.00%',size: 12,color: AppTheme.colorRed,),
            ].toRow()
          ].toColumn(crossAxisAlignment: CrossAxisAlignment.start,mainAxisAlignment: MainAxisAlignment.center),
          // 价格
          <Widget>[
            const TextWidget.body('0',size: 16,color: AppTheme.color666,weight: FontWeight.w600),
            SizedBox(height: 10.w),
            const TextWidget.body('\$0',size: 12,color: AppTheme.color666,),
          ].toColumn(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.end).paddingOnly(right: 30.w),
        ].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween).border(bottom: 1,color: AppTheme.dividerColor).expanded(),
      ]
          .toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween,)
          .paddingOnly(left: 30.w)
          .tight(height: 120.w)
          .clipRRect(all: 20.w),
    );
  }
  
  // 主视图
  Widget _buildView() {
    return SlidableAutoCloseBehavior(
      // 包裹整个列表,使同一 groupTag 的 Slidable 互斥 ✅
      child: CustomScrollView(
        slivers: [
          _buildAssetList(),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<HomeController>(
      init: HomeController(),
      id: "home",
      builder: (_) {
        return Scaffold(
          backgroundColor: AppTheme.pageBgColor,
          body: _buildView(),
        );
      },
    );
  }
}

控制器

dart 复制代码
import 'package:lingoaix/common/index.dart';
import 'package:get/get.dart';

class HomeController extends GetxController {
  HomeController();
  
  // 资产列表数据(示例数据)
  List<Map<String, dynamic>> assetList = [
    {'id': 1, 'symbol': 'BNB',},
    {'id': 2, 'symbol': 'USDT',},
    {'id': 3, 'symbol': 'ETH',},
    {'id': 4, 'symbol': 'BTC',},
    {'id': 5, 'symbol': 'SOL',},
    {'id': 6, 'symbol': 'DOGE',},
    {'id': 7, 'symbol': 'XRP',},
    {'id': 8, 'symbol': 'ADA',},
    {'id': 9, 'symbol': 'DOT',},
    {'id': 10, 'symbol': 'LINK',},
  ];


  /// 删除资产项 ✅
  void deleteAsset(int index) {
    if (index >= 0 && index < assetList.length) {
      assetList.removeAt(index);
      update(["home"]);
      Log.d('删除资产项: $index');
    }
  }

}
相关推荐
2501_919749031 小时前
鸿蒙 Flutter 实战:video_compress 3.1.4 适配 3.27-ohos 全流程
flutter·华为·harmonyos
h64648564h3 小时前
Flutter 国际化(i18n)全指南:一键切换中/英/日多语言
前端·javascript·flutter
kTR2hD1qb8 小时前
Flutter 复杂拖拽排序实战:同源排序 + 跨容器拖拽完整落地
flutter
jingling5559 小时前
Flutter | Dio网络请求实战
android·开发语言·前端·flutter
stringwu11 小时前
Flutter 复杂拖拽排序实战:同源排序 + 跨容器拖拽完整落地
flutter
UnicornDev12 小时前
【Flutter x HarmonyOS 6】设置页面的UI设计
flutter·ui·华为·harmonyos·鸿蒙
G_dou_13 小时前
Flutter+OpenHarmony实战:XMB Tracke
flutter·harmonyos·鸿蒙
●VON21 小时前
鸿蒙Flutter实战:分类管理页BottomSheet CRUD
数据库·flutter·华为·harmonyos·鸿蒙
woodWu1 天前
Flutter 复杂拖拽排序实战:同源排序 + 跨容器拖拽完整落地
flutter
小小小小小鹿1 天前
Vibe Coding 实战:Flutter 自定义路径布局
flutter·vibecoding