如何解决Flutter / Dart-在PageView中编辑页面,然后刷新并滚动回到同一位置?
当前,我可以将编辑内容提交到PageView
中的单个页面,然后将Navigator.push
提交给新创建的单个编辑页面,或者将Navigator.pop
提交回原始Pageview
包含未编辑的页面。
但是我希望在更新/刷新的网页浏览中弹出回到同一位置。我当时想可以在原始的PageView页面上这样做:
Navigator.pushReplacement(context,new MaterialPageRoute(
builder: (BuildContext context) => EditPage()),);
但是在编辑之后,如何弹出弹出页面并刷新到现在更新的原始页面?或者,还有更好的方法?有人提到了密钥,但是我还没有学会使用它们。
解决方法
该问题涉及反应式应用程序状态的概念。解决此问题的正确方法是拥有Bloc或Redux之类的应用程序状态管理解决方案。
说明:应用程序状态会处理您正在编辑的数据。 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 举报,一经查实,本站将立刻删除。