Удаление строки свайпом Dismissible в Flutter
Удаление с жестом «смахнуть» делают виджетом
Dismissible.
Он оборачивает строку списка. Когда
пользователь уводит её достаточно далеко,
вызывается onDismissed - там убирают
элемент из данных и вызывают setState.
У каждого Dismissible обязан быть
уникальный ValueKey
(или другой Key), привязанный к
данным строки. Без ключа Flutter может
перепутать анимацию и состояние соседних
элементов после удаления:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final items = <String>['Letter 1', 'Letter 2', 'Letter 3'];
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final title = items[index];
return Dismissible(
key: ValueKey(title),
direction: DismissDirection.endToStart,
background: Container(
color: Colors.red.shade300,
alignment: Alignment.centerRight,
padding: const EdgeInsets.only(right: 20),
child: const Icon(Icons.delete, color: Colors.white),
),
onDismissed: (direction) {
setState(() {
items.removeAt(index); // index still points at this row
});
},
child: ListTile(title: Text(title)),
);
},
),
);
}
}
Список из пяти заметок. Каждая в
Dismissible с ValueKey
по тексту заметки. Свайп влево удаляет
пункт из списка. Фон при свайпе -
красный с иконкой удаления.