Flutter/Dart - изменить страницу в PageView, затем обновить и вернуться в то же место?
В настоящее время я могу вносить изменения на одну страницу в PageView
а потом либо Navigator.push
на вновь созданную единственную отредактированную страницу или Navigator.pop
вернуться к оригиналу Pageview
содержащий неотредактированную страницу.
Но я бы предпочел вернуться в то же место в обновленном / обновленном просмотре страницы. Я думал, что могу сделать это на исходной странице PageView:
Navigator.pushReplacement(context,new MaterialPageRoute(
builder: (BuildContext context) => EditPage()),);
Но после редактирования, как я могу вернуться к обновленному PageView, который прокручивается до обновленной исходной страницы? Или есть способ лучше? Кто-то упомянул ключи, но я еще не научился ими пользоваться.
2 ответа
Вы это знаете Navigator.pushReplacement(...)
возвращает Future<T>
что завершится, когда вы наконец вернетесь к исходному контексту? Так как же вы собираетесь использовать этот факт? Допустим, вы хотите обновитьString
исходной страницы:
String itWillBeUpdated="old value";
@override
Widget build(BuildContext ctx)
{
.
.
.
onPressesed:() async {
itWillBeUpdated= await Navigator.pushReplacement(context,new MaterialPageRoute(
builder: (BuildContext context) => EditPage()),);
setState((){});
},
}
На странице редактирования вы можете определить Navigator.pop(...)
как это:
Navigator.pop<String>(context, "new string");
сделав это, вы можете вернуть любые данные на исходную страницу и позвонив setState((){})
, ваша страница отразит изменения
Вопрос касается концепции Reactive App-State. Правильный способ справиться с этим - использовать решение для управления состоянием приложения, такое как Bloc или Redux.
Объяснение: Состояние приложения заботится о данных, которые вы редактируете. EditPage просто сообщает хранилищу (контейнеру App-State) отредактировать эти данные, а фреймворк позаботится о данных, которые должны быть обновлены в PageView.
в качестве временного решения вы можете использовать асинхронный вызов Navigation.push()
и обновите состояние PageView, как только EditPage вернется. вы также можете использовать перегруженную версиюpop()
чтобы вернуть условие успеха, которое помогает для условного setState()
.
Это не идеально, но отчасти работает. Сначала я создал
provider
class и добавил следующее;
class AudioWidgetProvider with ChangeNotifier {
int refreshIndex;
setRefreshIndex (ri) {
refreshIndex = ri;
return refreshIndex;
}
}
Тогда в моем
PageView Builder
на первой странице я сделал это;
Widget build(context) {
var audioWidgetProvider = Provider.of<AudioWidgetProvider>(context);
return
PreloadPageView.builder(
controller: PreloadPageController(initialPage: audioWidgetProvider.refreshIndex?? 0),
Затем, чтобы перейти к EditPage (2-й экран), я сделал следующее;
onPressed: () async {
audioWidgetProvider.setRefreshIndex(currentIndex);
Navigator.pushReplacement(context,new MaterialPageRoute(builder: (BuildContext context) => EditPage()),); }
И, наконец, я сделал это, чтобы вернуться к перезагруженному PageView, прокрученному до отредактированной страницы;
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) =>HomePage()));
Единственная проблема сейчас заключается в том, что список PageView поступает из запроса PHP/Mysql, и я не уверен, что делать, если новые элементы добавляются в список из базы данных Mysql. Это означает, что currentIndex будет неправильным. Но я думаю, это тема другого вопроса.