Это очень похоже на проблему, с которой мы столкнулись несколько месяцев назад.У нас есть ящик со ссылками на четыре разных списка вещей.Списки полностью независимы друг от друга и являются их собственной страницей.Вы также можете нажать на один из этих элементов в списке и перейти на страницу с подробностями.
(После того, как вы нажали на страницу сведений, вы можете нажать только кнопку «Назад», ящик будет доступен только в списках и других страницах верхнего уровня).
Сами списки можно сортировать, paginate, может фильтровать и быстрый поиск.Каждый список сохраняет свое состояние в сеансе, который основан на шаблоне Inherited Widget.Я основал свой класс Session на этом посте:
Флаттер: Как правильно использовать Inherited Widget?
Если вы хотите перейти в Список A, сортируйте столбец, используя ящик, чтобы перейти к списку B, а затем нажать назад, чтобы вернуться к списку A., список будет отображаться в том же состоянии, в котором вы его оставили.
Если бы вы должны были перейти к списку A, отсортируйтеколонке, использовали ящик для перехода к списку B, а затем снова использовали ящик для перехода к списку A. Список будет отображаться в том же состоянии, в котором вы его оставили.
Разница между этими двумя сценариями заключается в том, чтоСтек навигации выглядит так.В первом случае стек представляет собой просто список А. Во втором случае стек представляет собой список А, список В, список А.
Если вы выбрали второй сценарий, внесите изменения в список А изатем дважды вставьте стек (нажав кнопку «назад»), список A в нижней части стека на самом деле выглядит как список A, который вы изменили выше в стеке.
Вот частичный взгляд на мой класс Session, который поддерживаетсохранение состояния одного из списков.Обратите внимание, что это специально называется сессией, и что приложение забывает это состояние, когда приложение закрыто.Хотя было бы относительно легко сохранить его в общем хранилище.
class Session extends StatefulWidget {
final Widget child;
Session({this.child});
@override
SessionState createState() => SessionState();
static SessionState of(BuildContext context) {
return (context.inheritFromWidgetOfExactType(_Session) as _Session).data;
}
}
class SessionState extends State<Session> {
ListPagePreferences _myListPrefs = ListPagePreferences();
//called when the user logs out, for example
void clear() {
setState(() {
_myListPrefs = ListPagePreferences();
});
}
ListPagePreferences get myListPrefs => _myListPrefs;
void updatePrefs({
ListPagePreferences prefs,
rowsPerPage,
startIndex,
sortColumnIndex,
sortAscending,
searchValue,
filter,
}) {
setState(() {
prefs.updatePrefs(
rowsPerPage: rowsPerPage,
startIndex: startIndex,
sortColumnIndex: sortColumnIndex,
sortAscending: sortAscending,
searchValue: searchValue,
filter: filter,
);
});
}
@override
Widget build(BuildContext context) {
return _Session(
data: this,
child: widget.child,
);
}
}
class _Session extends InheritedWidget {
final SessionState data;
_Session({Key key, this.data, Widget child}) : super(key: key, child: child);
@override
bool updateShouldNotify(_Session old) => true;
}
Мое приложение затем обернулось этим унаследованным виджетом:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return Session(
child: MaterialApp(
title: "My App",
home: WelcomePage(),
),
);
}
}
Это означает, что из любого места в приложении я могу получить доступСеанс и хранить вещи в нем.То, как оно используется в любом месте приложения, выглядит так:
ListPagePreferences savedPrefs = Session.of(context).myListPrefs;
Есть и другие способы сохранения состояния, но это было довольно просто и легко для наших нужд.