微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter / Dart-在PageView中编辑页面,然后刷新并滚动回到同一位置?

如何解决Flutter / Dart-在PageView中编辑页面,然后刷新并滚动回到同一位置?

当前,我可以将编辑内容提交到PageView中的单个页面,然后将Navigator.push提交给新创建的单个编辑页面,或者将Navigator.pop提交回原始Pageview包含未编辑的页面

但是我希望在更新/刷新的网页浏览中弹出回到同一位置。我当时想可以在原始的PageView页面上这样做:

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

但是在编辑之后,如何弹出弹出页面并刷新到现在更新的原始页面?或者,还有更好的方法?有人提到了密钥,但是我还没有学会使用它们。

解决方法

该问题涉及反应式应用程序状态的概念。解决此问题的正确方法是拥有BlocRedux之类的应用程序状态管理解决方案。

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

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

,

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

,

这不是理想的方法,但是有些起作用。首先,我创建了一个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将是错误的。但是我想这是另一个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。