Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振/省道-在页面视图中编辑页面,然后刷新并滚动回同一位置?_Flutter_Dart_Flutter Pageview_Flutter Routes - Fatal编程技术网

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函数是