Flutter 如何在Flatter中处理/终止页面视图中的页面
我有一个包含两个页面的页面视图,两个页面的每个页面都有一个自定义导航器堆栈 在初始开始时(假设我在第1页上开始),第2页是在我开始滚动或跳转到它时构建的(正常情况下) 我想当我在第2页,回到第1页,反之亦然,这些页面保持活动状态,我想处置/杀死它们以强制重建..至少在第2页 我尝试了Flutter 如何在Flatter中处理/终止页面视图中的页面,flutter,flutter-layout,Flutter,Flutter Layout,我有一个包含两个页面的页面视图,两个页面的每个页面都有一个自定义导航器堆栈 在初始开始时(假设我在第1页上开始),第2页是在我开始滚动或跳转到它时构建的(正常情况下) 我想当我在第2页,回到第1页,反之亦然,这些页面保持活动状态,我想处置/杀死它们以强制重建..至少在第2页 我尝试了wantKeepAlive=false,但没有成功 有人可以分享一种方法来实现这一点。刷卡重建 如果目标是告诉我们的小部件在页面被来回滑动时重建,我们可以使用PageView.builder的onPageChange
wantKeepAlive=false
,但没有成功
有人可以分享一种方法来实现这一点。刷卡重建
如果目标是告诉我们的小部件在页面被来回滑动时重建,我们可以使用PageView.builder的onPageChanged
回调
onPageChanged:
将在每次查看页面时运行我们提供的函数
链接onPageChanged
以重建页面
在onPageChanged
和在PageView
中重建页面之间没有内置连接
onPageChanged
只运行我们提供的任意函数,仅此而已
如果我们希望用onPageChanged
重建页面,我们需要自己创建链接
链接到ValueNotifier
/ValueListenableBuilder
在本例中,我们使用ValueNotifier
(buildCount
变量)通知ValueListenableBuilder
在buildCount
发生更改时重新生成。(有关信息,请参阅。)
每次滑动页面时,buildCount
将增加,页面中的ValueListenableBuilder
将重新生成,显示新的总数:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class PageViewRebuildPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PageView Stream Rebuild'),
),
body: PageViewRebuildExample()
);
}
}
class PageViewRebuildExample extends StatelessWidget {
final List<String> contents = ['One', 'Two', 'Three'];
final ValueNotifier<int> buildCount = ValueNotifier<int>(0);
@override
Widget build(BuildContext context) {
print('Example built');
return Center(
child: PageView.builder(
itemCount: contents.length,
onPageChanged: (page) {
print('PageChanged $page');
buildCount.value++;
},
itemBuilder: (context, index) {
return Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(vertical: 40, horizontal: 20),
color: Colors.lightBlueAccent,
child: ValueListenableBuilder(
valueListenable: buildCount,
// bldCnt here ↓↓ is buildCount.value
builder: (context, bldCnt, child) =>
// ↓ YOUR STUFF GOES HERE ↓
Text('Page ${contents[index]} : $bldCnt',
style: TextStyle(fontSize: 30)),
),
);
},
),
);
}
}
上面示例侦听器的输出是(截短):
I/颤振(14528):精确页面位置0.001861572265625
I/颤振(14528):精确页面位置0.006500244140625
I/颤振(14528):精确页面位置0.01019287109375
I/颤振(14528):精确页面位置0.012054443359375
...
I/颤振(14528):精确页面位置0.45981356897799835
I/颤振(14528):精确页面位置0.5179874247450384
I/颤振(14528):第1页
I/颤振(14528):精确页面位置0.5743095749455654
I/颤振(14528):精确页面位置0.6269737660740682
...
I/颤振(14528):精确页面位置0.9986377335325707
I/颤振(14528):精确页面位置0.9988375372072605
I/颤振(14528):精确页面位置0.9990080727700607
I/颤振(14528):精确页面位置1.0
1可能还有很多其他方法可以做到这一点,这只是一种方法。例如,使用Stream
将事件从onPageChanged
发送到StreamBuilder
内部itemBuilder
是另一种方法。刷卡重建
如果目标是告诉我们的小部件在页面被来回滑动时重建,我们可以使用PageView.builder的onPageChanged
回调
onPageChanged:
将在每次查看页面时运行我们提供的函数
链接onPageChanged
以重建页面
在onPageChanged
和在PageView
中重建页面之间没有内置连接
onPageChanged
只运行我们提供的任意函数,仅此而已
如果我们希望用onPageChanged
重建页面,我们需要自己创建链接
链接到ValueNotifier
/ValueListenableBuilder
在本例中,我们使用ValueNotifier
(buildCount
变量)通知ValueListenableBuilder
在buildCount
发生更改时重新生成。(有关信息,请参阅。)
每次滑动页面时,buildCount
将增加,页面中的ValueListenableBuilder
将重新生成,显示新的总数:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class PageViewRebuildPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PageView Stream Rebuild'),
),
body: PageViewRebuildExample()
);
}
}
class PageViewRebuildExample extends StatelessWidget {
final List<String> contents = ['One', 'Two', 'Three'];
final ValueNotifier<int> buildCount = ValueNotifier<int>(0);
@override
Widget build(BuildContext context) {
print('Example built');
return Center(
child: PageView.builder(
itemCount: contents.length,
onPageChanged: (page) {
print('PageChanged $page');
buildCount.value++;
},
itemBuilder: (context, index) {
return Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(vertical: 40, horizontal: 20),
color: Colors.lightBlueAccent,
child: ValueListenableBuilder(
valueListenable: buildCount,
// bldCnt here ↓↓ is buildCount.value
builder: (context, bldCnt, child) =>
// ↓ YOUR STUFF GOES HERE ↓
Text('Page ${contents[index]} : $bldCnt',
style: TextStyle(fontSize: 30)),
),
);
},
),
);
}
}
上面示例侦听器的输出是(截短):
I/颤振(14528):精确页面位置0.001861572265625
I/颤振(14528):精确页面位置0.006500244140625
I/颤振(14528):精确页面位置0.01019287109375
I/颤振(14528):精确页面位置0.012054443359375
...
I/颤振(14528):精确页面位置0.45981356897799835
I/颤振(14528):精确页面位置0.5179874247450384
I/颤振(14528):第1页
I/颤振(14528):精确页面位置0.5743095749455654
I/颤振(14528):精确页面位置0.6269737660740682
...
I/颤振(14528):精确页面位置0.9986377335325707
I/颤振(14528):精确页面位置0.9988375372072605
I/颤振(14528):精确页面位置0.9990080727700607
I/颤振(14528):精确页面位置1.0
1可能还有很多其他方法可以做到这一点,这只是一种方法。例如,使用Stream
将事件从onPageChanged
发送到StreamBuilder
中的itemBuilder
是另一种方法。我如何更正当您滚动到屏幕中间时触发的onPageChanged
,以便在滚动开始时触发。同样出于好奇,您知道在.builder()
方法中,用于关闭在视口中不可见的小部件的逻辑吗。这个想法似乎更合适though@bihireboris我不确定我是否理解你的第一个评论问题。如果您需要对页面滑动进行细粒度控制(即滚动手势期间的精确位置),我们可以使用PageController
及其page
属性。我将补充这一点作为回答的补充。@bihireboris,我不太熟悉PageView
上的处理逻辑。为此,您必须浏览PageView
的SDK定义。我如何更正当您滚动到屏幕中间时触发的onPageChanged
,以在滚动启动时触发。另外,出于好奇,您知道使用的逻辑吗
I/flutter (14528): Precise page position 0.001861572265625
I/flutter (14528): Precise page position 0.006500244140625
I/flutter (14528): Precise page position 0.01019287109375
I/flutter (14528): Precise page position 0.012054443359375
... <snip>
I/flutter (14528): Precise page position 0.45981356897799835
I/flutter (14528): Precise page position 0.5179874247450384
I/flutter (14528): PageChanged 1
I/flutter (14528): Precise page position 0.5743095749455654
I/flutter (14528): Precise page position 0.6269737660740682
... <snip>
I/flutter (14528): Precise page position 0.9986377335325707
I/flutter (14528): Precise page position 0.9988375372072605
I/flutter (14528): Precise page position 0.9990080727700607
I/flutter (14528): Precise page position 1.0