Отделить от Vaadin Dataprovider: как избежать автоматической загрузки?.
Для приложения Vaadin Flow 19 с MainView extends AppLayout
, GridView
и EmptyView
и @PreserveOnRefresh
аннотация используется на MainView
.
При возврате в GridView
GridView
должен быть точно в том же состоянии, что и раньше:
- открыть
GridView
с помощью кнопки вMainView
впервые - ›Grid используетDataProvider
для извлечения данных из серверной части - введите "Человек-паук" в
TextField
с подписью "СостояниеПроверьте" - переключиться на
EmptyView
с помощью кнопки вMainView
- в реальном приложении: сделайте что-нибудь в
EmptyView
и, возможно, в других представлениях - вернуться к
GridView
с помощью кнопки вMainView
второй раз
Затем (1) TextField
с заголовком stateCheck должен отображать значение Spiderman
и (2) сетка должна по-прежнему отображать те же данные, что и раньше; он не должен перезагружать данные из серверной части
Наблюдаемое поведение: (1) нормально, но (2) нет: сетка всегда вызывает fetch
метод для получения данных из серверной части.
Как добиться желаемого поведения?
Вот код моего GridView
, который также подделывает серверную часть DataProvider
:
@Route(value = "grid", layout = MainView.class)
public class GridView extends VerticalLayout {
public GridView() {
final Grid<Person> g = new Grid(Person.class);
g.setColumns("name");
g.setDataProvider(DataProvider.fromCallbacks(q -> fetch(q), q -> count(q)));
add(g);
add(new TextField("State check"));
}
// fake DataProvider
private int count(Query<Person, Void> q) { return 3; }
private Stream<Person> fetch(Query<Person, Void> q) {
q.getLimit(); //vaadin checks these have been called
q.getOffset(); //vaadin checks these have been called
System.out.println("fetching again");
return Arrays.asList(new Person("1"), new Person("2"), new Person("3")).stream();
}
}
MainView
используется для переключения между GridView
и EmptyView
@PreserveOnRefresh
public class MainView extends AppLayout {
private Component emptyBView;
private Component gridBView;
public MainView() {
final Button emptyB = new Button("Btn empty");
emptyB.addClickListener(e -> {
if (emptyBView == null) { emptyBView = new EmptyView();}
setContent(emptyBView);
});
addToNavbar(emptyB);
final Button gridB = new Button("Btn grid");
gridB.addClickListener(e -> {
if (gridBView == null) gridBView = new GridView();
setContent(gridBView);
});
addToNavbar(gridB);
}
}
@PreserveOnRefresh
предназначен для использования в представлениях с@Route
. В вашем случае вы не используете маршрутизатор для навигации, а просто вручную переключаете компоненты. Проблема, связанная с вызовомDataProvider
при повторном подключении представления, может быть ошибкой. - person Marcus Hellberg   schedule 30.04.2021@Route
, которая привела к этому примеру кода - спасибо - person sk_dev   schedule 03.05.2021