0

目前,我可以将编辑提交到 a 中的单个页面,PageView然后提交Navigator.push到新创建的单个编辑页面或Navigator.pop返回到Pageview包含未编辑页面的原始页面。

但我更愿意在更新/刷新的网页浏览中弹回到同一个地方。我在想我可以在原始的 PageView 页面上做到这一点:

       Navigator.pushReplacement(context,new MaterialPageRoute(
           builder: (BuildContext context) => EditPage()),);

但是在编辑之后,我怎样才能弹出一个刷新的 PageView 并滚动到现在更新的原始页面?或者,还有更好的方法?有人提到了钥匙,但我还没有学会使用它们。

4

3 回答 3

1

您是否知道当您最终返回原始上下文时会Navigator.pushReplacement(...)返回一个完成的内容?Future<T>那么你将如何利用这个事实呢?假设您要更新String原始页面的 a :

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((){}),您的页面将反映更改

于 2020-09-05T15:00:15.833 回答
1

该问题涉及 Reactive App-State 的概念。处理此问题的正确方法是使用BlocRedux等应用程序状态管理解决方案。

说明:应用程序状态负责您正在编辑的数据。EditPage 只是告诉商店(App-State 容器)编辑该数据,而框架会处理应该在 PageView 中更新的数据。

作为临时解决方案,您可以Navigation.push()在 EditPage 返回后使用异步调用并刷新 PageView 状态。您还可以使用 的 重载版本pop()来返回一个成功条件,这有助于条件setState().

于 2020-09-05T14:51:19.573 回答
0

这并不理想,但有些作用。首先,我创建了一个provider类并添加了以下内容;

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(第二个屏幕),我这样做了;

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 将是错误的。但我想这是另一个问题的主题。

于 2020-09-06T22:02:57.363 回答