rows.add(newRow);
grid.getDataProvider().refreshAll();
grid.getEditor().editItem(newRow);
java.lang.IllegalStateException: The item com.ec.traveller.TestGridInsert$Row@108 is not in the backing data provider
at deployment.ptsmc.ear//com.vaadin.flow.component.grid.editor.EditorImpl.validate(EditorImpl.java:221)
at deployment.ptsmc.ear//com.vaadin.flow.component.grid.editor.EditorImpl.requestEditItem(EditorImpl.java:147)
at deployment.ptsmc.ear//com.vaadin.flow.component.grid.editor.EditorImpl.lambda$editItem$2d5ea2ce$1(EditorImpl.java:137)
at deployment.ptsmc.ear//com.vaadin.flow.internal.StateTree.lambda$runExecutionsBeforeClientResponse$2(StateTree.java:397)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at deployment.ptsmc.ear//com.vaadin.flow.internal.StateTree.runExecutionsBeforeClientResponse(StateTree.java:392)
at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlWriter.encodeChanges(UidlWriter.java:394)
at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlWriter.createUidl(UidlWriter.java:170)
at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlRequestHandler.createUidl(UidlRequestHandler.java:155)
at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:145)
at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:115)
at deployment.ptsmc.ear//com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
at deployment.ptsmc.ear//com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1574)
at deployment.ptsmc.ear//com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398)
at jakarta.servlet.api@6.0.0//jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
If grid has 49 rows, it works. It then also works to add&edit more rows, so it looks like this is only an initial issue?
Expected-behavior
Adding&editing row should always work
Reproduction
package com.ec.traveller;
import java.util.ArrayList;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.router.Route;
/**
* Possible bug with insert in Grid when there are 50+ rows?
*/
@Route
public class TestGridInsert extends VerticalLayout {
static int idSequence = 0;
public static class Row {
int id = idSequence++;
String name;
Row(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
return obj instanceof Row that && that.id == this.id;
}
@Override
public int hashCode() {
return id;
}
}
public TestGridInsert() {
// Data
var rows = new ArrayList<Row>();
for(int i=0; i<50; i++) {
rows.add(new Row("John Doe " + i));
}
// Grid with editor
var grid = new Grid<Row>(rows);
var namecol = grid.addColumn(Row::getName).setHeader("Name");
grid.setSizeFull();
var binder = new Binder<>(Row.class);
var editor = grid.getEditor();
editor.setBinder(binder);
TextField nameField = new TextField();
nameField.setWidthFull();
binder.forField(nameField)
.bind(Row::getName, Row::setName);
namecol.setEditorComponent(nameField);
// Button to add new row
var addRowButton = new Button("Add", event -> {
var newRow = new Row("Jane Doe");
rows.add(newRow);
grid.getDataProvider().refreshAll();
grid.getEditor().editItem(newRow);
});
//
setSizeFull();
add(addRowButton, grid);
}
}
Describe the bug
This fails if the Grid initially has 50 rows:
If grid has 49 rows, it works. It then also works to add&edit more rows, so it looks like this is only an initial issue?
Expected-behavior
Adding&editing row should always work
Reproduction
System Info
Windows 10, Vaadin 24.3.12, Firefox 126.0.1