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 будет неправильным. Но я думаю, это тема другого вопроса.

Другие вопросы по тегам