Flutter 颤振导航器-从页面堆栈交换页面

Flutter 颤振导航器-从页面堆栈交换页面,flutter,Flutter,我的处境有点乏味。我正在推2页到导航器 A-B B是最新推出的 出于某些原因。我不想弹出B以从B导航到A。我想替换/交换它们。原因在于国家。我想保留A和B页面的状态,因为有些小部件构建成本极高(Unity view小部件)。从B我如何使用导航器,这样在不破坏我的页面的情况下,我可以用A交换B 以下是流程: A将作为默认页面打开 B被推着 Navigator.of(context.pushNamed() 页面堆栈是A-B 从B我想导航到A,同时保持B页面的活动状态 -经过一些神奇的手术后,

我的处境有点乏味。我正在推2页到导航器

A-B

B是最新推出的

出于某些原因。我不想弹出B以从B导航到A。我想替换/交换它们。原因在于国家。我想保留A和B页面的状态,因为有些小部件构建成本极高(Unity view小部件)。从B我如何使用导航器,这样在不破坏我的页面的情况下,我可以用A交换B

以下是流程:

  • A将作为默认页面打开

  • B被推着

    Navigator.of(context.pushNamed()

    页面堆栈是A-B

  • 从B我想导航到A,同时保持B页面的活动状态

  • -经过一些神奇的手术后,我失踪了-

  • 页面堆栈是B-A。用户看到页面A。没有一个页面被破坏。他们交换了


在Flatter中有这样做的方法吗?

您可以使用
PageView
获得简单的方法,并设置如下配置:

PageController _pagerController = PageController(keepPage: true);

PageView(
      physics: NeverScrollableScrollPhysics(),
      controller: _pagerController,
      children: [
         Page_A(),
         Page_B(),
      ],
),
和用于在页面之间切换:

goNextPage() {
  _pagerController.animateToPage(
    currentPage + 1,
    duration: Duration(milliseconds: 500),
    curve: Curves.ease,
  );
}

goPrevPage() {
  _pagerController.animateToPage(
    currentPage - 1,
    duration: Duration(milliseconds: 500),
    curve: Curves.ease,
  );
}
我希望它对你有用。

也许正是你想要的。它在小部件和电视频道之间切换。更改时不会重建小部件

根据您的需求,使用动画切换页面,
AnimatedSwitcher
似乎最接近您想要的,除了它确实重建了小部件。因此,我认为
IndexedStack
是您想要的一个良好开端


您也可以参考或在页面视图、ListView和GridView构建器中提到,它们是为大量对象而设计的。并在滚动时重建

列或行保存其所有子生成

你可以试试:

SingleChildScrollView(无滚动)->行->A(屏幕大小相等)和B(相同)

然后设置动画或跳转到:

对于A偏移0和B偏移屏幕宽度

我试过了,效果很好


///
类AtoBExample扩展StatefulWidget{
@凌驾
_AtoBExampleState createState()=>\u AtoBExampleState();
}
类_AtobeExampleState扩展状态{
ScrollController ScrollController=ScrollController();
_toB(){
//!!!转发或此处的任何操作动画
//例如,将A的不透明度设置为1到0,然后等待完成
scrollController.jumpTo(MediaQuery.of(context).size.width);
//并将B的不透明度设置为0到1
}
_toA(){
//!!!转发或此处的任何操作动画
//例如,将B的不透明度设置为1到0,然后等待完成
scrollController.jumpTo(0);
//并将A的不透明度设置为0到1
}
@凌驾
小部件构建(构建上下文){
var size=MediaQuery.of(context).size;
返回脚手架(
正文:SingleChildScrollView(
控制器:滚动控制器,
滚动方向:轴水平,
物理学:const NeverScrollableScrollPhysics(),
孩子:排(
儿童:[
//A
建筑商(
承建商:(c){
打印(“绿色构建”);
回墨槽(
onTap:(){
打印(‘至B’);
_toB();
},
子:容器(
宽度:size.width,
高度:size.height,
颜色:颜色。绿色,
),
);
},
),
建筑商(
承建商:(c){
打印(“红色构建”);
回墨槽(
onTap:(){
打印('TO A');
_toA();
},
子:容器(
宽度:size.width,
高度:size.height,
颜色:颜色,红色,
),
);
},
)
],
),
),
);
}
}

使用
Navigator
2.0?(我的意思是
MaterialApp.router
)它看起来太复杂了,而且我的应用程序中已经设置了很多路由。这将是最后的选择。谢谢你的建议。好吧,你也可以把它们混合在一起,请参见和^F
Pageless Routes
我真的认为使用Navigator 2.0是不可能的,我遗漏了什么吗?这是一个聪明的解决方案,但是PageView能确保不可见的小部件处于保留状态吗?我的意思是,当你用navigator推一个新页面时,旧页面不会占用太多内存。使用这种页面浏览方式,难道不是每一页都在内存中处于活动状态吗?是的,有两页处于活动状态。但这取决于您使用的数据类型,如果数据像类模型一样简单,您可以将模型存储在静态字段中,当用户单击切换第二页时,使用此模型来完成页面,但如果页面的所有内容都很重要,如滚动、填充文本字段等等,简单的方法是使用
PageView
。这缺少对页面更改非常重要的自定义动画,如淡入淡出:(这是您的自定义设置!您可以为此使用许多过渡!例如:“或”“或”“:(不,这不是因为它不允许自定义动画。我想要完全控制动画。不是一些预定义的动画。我想要与导航器动画相同的动画。我想要保留动画。我用一些示例更新答案,说明其他人如何实现动画IndexedStack。我无法重建小部件,因为每次重建都需要时间大约3秒钟,unity将处于活动状态。我在启动屏幕中创建此小部件,并将其保留在那里。在发布之前,请阅读其他答案上的评论。我已经说过“这缺少自定义动画,例如淡入淡出,这对页面更改非常重要:(”这也适用于您的答案。@csguy抱歉。但我想添加:对于淡入淡出动画,请使用Transform.opacity()包装一个小部件,并使用动画值定义不透明度。将此动画转发到(例如)方法中。如果使用此方法,则