Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗flPmMuKy 90 of 125 menu
◀ ▶

ValueKey при удалении из списка в Flutter

Flutter сопоставляет виджеты между перерисовками по типу, позиции и Key. В ListView после removeAt элемент с индексом 1 становится другим текстом, но без ключа фреймворк может считать, что это «та же» строка и оставить старое состояние или анимацию.

Виджет Dismissible требует ключ явно. Правильно брать стабильный идентификатор из данных - текст, если он уникален, или поле id. Нельзя использовать только index как ValueKey(index) для долгоживущих строк: после удаления индексы сдвигаются, и ключи «переезжают» к другим элементам:

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>['alpha', 'beta', 'gamma']; @override Widget build(BuildContext context) { return Scaffold( body: ListView.builder( itemCount: items.length, itemBuilder: (context, index) { final label = items[index]; return Dismissible( key: ValueKey(label), onDismissed: (_) { setState(() { items.removeAt(index); }); }, child: ListTile( title: Text(label), subtitle: const Text('Key = row text'), ), ); }, ), ); } }

Три строки с разными словами в Dismissible. У каждой ValueKey по тексту строки. Удалите среднюю свайпом и убедитесь, что нижняя строка не «мигает» чужим содержимым. Затем замените ключ на ValueKey(index) и сравните поведение на том же сценарии.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить