Skip to content

Commit 9df6e5f

Browse files
committed
Use custom keys for list and grid view items
Updated GridView, ListView, and ReorderableListView controls to use a custom key from item.getKey('key') if available, falling back to the item id. This improves widget identity and helps prevent unnecessary rebuilds when item order changes.
1 parent fd46c2e commit 9df6e5f

3 files changed

Lines changed: 15 additions & 9 deletions

File tree

packages/flet/lib/src/controls/grid_view.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import 'package:flutter/widgets.dart';
22

33
import '../controls/control_widget.dart';
4-
import '../extensions/control.dart';
54
import '../models/control.dart';
65
import '../utils/edge_insets.dart';
6+
import '../utils/keys.dart';
77
import '../utils/layout.dart';
88
import '../utils/misc.dart';
99
import '../utils/numbers.dart';
@@ -92,7 +92,7 @@ class _GridViewControlState extends State<GridViewControl> {
9292
gridDelegate: gridDelegate,
9393
children: controls
9494
.map((item) => ControlWidget(
95-
key: ValueKey(item.id),
95+
key: ValueKey(item.getKey("key")?.value ?? item.id),
9696
control: item,
9797
))
9898
.toList(),
@@ -110,7 +110,8 @@ class _GridViewControlState extends State<GridViewControl> {
110110
itemCount: controls.length,
111111
itemBuilder: (context, index) {
112112
return ControlWidget(
113-
key: ValueKey(controls[index].id),
113+
key: ValueKey(controls[index].getKey("key")?.value ??
114+
controls[index].id),
114115
control: controls[index],
115116
);
116117
},

packages/flet/lib/src/controls/list_view.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import 'package:flet/src/utils/layout.dart';
21
import 'package:flutter/material.dart';
32

43
import '../extensions/control.dart';
54
import '../models/control.dart';
65
import '../utils/edge_insets.dart';
6+
import '../utils/keys.dart';
7+
import '../utils/layout.dart';
78
import '../utils/misc.dart';
89
import '../utils/numbers.dart';
910
import '../widgets/error.dart';
@@ -82,7 +83,7 @@ class _ListViewControlState extends State<ListViewControl> {
8283
prototypeItem: prototypeItem,
8384
children: controls
8485
.map((item) => ControlWidget(
85-
key: ValueKey(item.id),
86+
key: ValueKey(item.getKey("key")?.value ?? item.id),
8687
control: item,
8788
))
8889
.toList(),
@@ -99,7 +100,8 @@ class _ListViewControlState extends State<ListViewControl> {
99100
itemCount: controls.length,
100101
itemBuilder: (context, index) {
101102
return ControlWidget(
102-
key: ValueKey(controls[index].id),
103+
key: ValueKey(controls[index].getKey("key")?.value ??
104+
controls[index].id),
103105
control: controls[index],
104106
);
105107
},
@@ -128,7 +130,8 @@ class _ListViewControlState extends State<ListViewControl> {
128130
itemExtent: itemExtent,
129131
itemBuilder: (context, index) {
130132
return ControlWidget(
131-
key: ValueKey(controls[index].id),
133+
key: ValueKey(controls[index].getKey("key")?.value ??
134+
controls[index].id),
132135
control: controls[index],
133136
);
134137
},

packages/flet/lib/src/controls/reorderable_list_view.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33
import '../extensions/control.dart';
44
import '../models/control.dart';
55
import '../utils/edge_insets.dart';
6+
import '../utils/keys.dart';
67
import '../utils/misc.dart';
78
import '../utils/mouse.dart';
89
import '../utils/numbers.dart';
@@ -121,7 +122,8 @@ class _ListViewControlState extends State<ReorderableListViewControl> {
121122
onReorderStart: onReorderStart,
122123
itemBuilder: (context, index) {
123124
return ControlWidget(
124-
key: ValueKey(_controls[index].id),
125+
key: ValueKey(_controls[index].getKey("key")?.value ??
126+
_controls[index].id),
125127
control: _controls[index],
126128
);
127129
},
@@ -147,7 +149,7 @@ class _ListViewControlState extends State<ReorderableListViewControl> {
147149
onReorderStart: onReorderStart,
148150
children: _controls
149151
.map((item) => ControlWidget(
150-
key: ValueKey(item.id),
152+
key: ValueKey(item.getKey("key")?.value ?? item.id),
151153
control: item,
152154
))
153155
.toList(),

0 commit comments

Comments
 (0)