Flutter 颤振/省道-在页面视图中编辑页面,然后刷新并滚动回同一位置?
目前,我可以在Flutter 颤振/省道-在页面视图中编辑页面,然后刷新并滚动回同一位置?,flutter,dart,flutter-pageview,flutter-routes,Flutter,Dart,Flutter Pageview,Flutter Routes,目前,我可以在PageView中提交对单个页面的编辑,然后选择Navigator。将推到新创建的单个编辑页面或Navigator。弹出返回包含未编辑页面的原始PageView 但我更喜欢在更新/刷新的页面视图中弹出到相同的位置。我想我可以在最初的页面浏览页面上这样做: Navigator.pushReplacement(context,new MaterialPageRoute( builder: (BuildContext context) => Ed
PageView
中提交对单个页面的编辑,然后选择Navigator。将推到新创建的单个编辑页面或Navigator。弹出返回包含未编辑页面的原始PageView
但我更喜欢在更新/刷新的页面视图中弹出到相同的位置。我想我可以在最初的页面浏览页面上这样做:
Navigator.pushReplacement(context,new MaterialPageRoute(
builder: (BuildContext context) => EditPage()),);
但是在编辑之后,我怎样才能弹出到一个刷新的页面视图,并滚动到现在更新的原始页面?还是有更好的办法?有人提到了键,但我还没有学会使用它们。这个问题涉及到反应式应用程序状态的概念。正确的处理方法是使用应用程序状态管理解决方案,如或
说明:应用程序状态负责您正在编辑的数据。EditPage只告诉store(应用程序状态容器)编辑该数据,框架负责在PageView中更新的数据
作为临时解决方案,您可以使用对Navigation.push()
的异步调用,并在EditPage返回后刷新PageView状态。您还可以使用重载版本的pop()
返回一个成功条件,该条件有助于有条件的setState()
该问题涉及被动应用程序状态的概念。正确的处理方法是使用应用程序状态管理解决方案,如或
说明:应用程序状态负责您正在编辑的数据。EditPage只告诉store(应用程序状态容器)编辑该数据,框架负责在PageView中更新的数据
作为临时解决方案,您可以使用对Navigation.push()
的异步调用,并在EditPage返回后刷新PageView状态。您还可以使用重载版本的pop()
返回一个成功条件,该条件有助于有条件的setState()
您知道吗Navigator.pushReplacement(…)
返回一个Future
,当您最终返回到原始上下文时完成?
那么你打算如何利用这个事实呢?
假设您要更新原始页面的字符串
:
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");
Navigator.pop(上下文,“新字符串”);
通过这样做,您可以将任何数据返回到原始页面,并且通过调用setState((){})
,您的页面将反映更改您知道Navigator.pushReplacement(…)
返回一个未来,当您最终返回到原始上下文时,该操作将完成吗?
那么你打算如何利用这个事实呢?
假设您要更新原始页面的字符串
:
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");
Navigator.pop(上下文,“新字符串”);
通过这样做,您可以将任何数据提供回原始页面,并通过调用setState((){})
,您的页面将反映更改这不是理想的,但有些效果。首先,我创建了一个提供者
类,并添加了以下内容:
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),
onPressed: () async {
audioWidgetProvider.setRefreshIndex(currentIndex);
Navigator.pushReplacement(context,new MaterialPageRoute(builder: (BuildContext context) => EditPage()),); }
最后,我这样做是为了返回一个重新加载的页面视图,滚动到编辑过的页面
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) =>HomePage()));
现在唯一的问题是PageView列表来自PHP/Mysql查询,如果从Mysql数据库向列表中添加新项,我不确定该怎么办。这意味着当前索引将是错误的。但我想这是另一个问题的主题。这并不理想,但有些效果。首先,我创建了一个提供者
类,并添加了以下内容:
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),
onPressed: () async {
audioWidgetProvider.setRefreshIndex(currentIndex);
Navigator.pushReplacement(context,new MaterialPageRoute(builder: (BuildContext context) => EditPage()),); }
最后,我这样做是为了返回一个重新加载的页面视图,滚动到编辑过的页面
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) =>HomePage()));
现在唯一的问题是PageView列表来自PHP/Mysql查询,如果从Mysql数据库向列表中添加新项,我不确定该怎么办。这意味着当前索引将是错误的。但我想这是另一个问题的主题。但这不会给我留下同样的问题吗?新刷新的页面视图从当前索引中的第一页开始,而不是从编辑过的页面开始?你有没有可能引导我了解有关如何使用Bloc更新单个页面视图的信息或教程?我发现了这一点。Bloc用于状态发生大量变化的应用程序,比如每秒刷新股票图表的股票市场应用程序。如果你真的想使用它,向creator学习-。但这不会给我留下同样的问题吗?新刷新的页面视图从当前索引的第一页开始,而不是从编辑过的页面开始?你有没有可能引导我了解有关如何使用Bloc更新单个页面视图的信息或教程?我找到了这个。Bloc用于状态发生大量变化的应用程序,比如每秒刷新股票图表的股票市场应用程序。如果你真的想使用它,那就向creator学习吧。我同意@Sushanth Kille的观点,这是一种临时解决方案,对于简单的应用程序来说效果很好。对于更复杂的应用程序,您应该考虑使用一些状态管理库技术,如提供者、BUC、ReDux等。我似乎不能调用“SESTATE”。我猜这是因为onPressed函数在PageViewer的createViewItem中。你需要一个StatefulWidget类来拥有setState((){})。我同意@Sushanth Kille的观点,这是一种临时解决方案,对于简单的应用程序来说效果很好。对于更复杂的应用程序,您应该考虑使用一些状态管理库技术,如提供者、BUC、ReDux等。我似乎不能调用“SESTATE”。我猜这是因为onPressed函数是