flutter - 如何在 Flutter 中处理/杀死 PageView 中的页面
问题描述
我有一个有 2 页的 PageView,我有一个自定义的导航器堆栈用于两个页面。
在最初的开始(假设我在第 1 页上加注星标),当我开始滚动或跳转到第 2 页时(正常),第 2 页就建立了。
想当我在第 2 页并返回第 1 页时,反之亦然,这些页面保持活动状态,我想处置/杀死它们以强制重建..至少在第 2 页上。
我试过wantKeepAlive = false
但没有用。
有人可以分享实现这一目标的方法吗?
解决方案
刷卡时重建
如果目标是告诉我们的小部件在页面被来回滑动时重建,我们可以onPageChanged
使用PageView.builder
. 1
onPageChanged:
每次查看页面时都会运行我们给它的函数。
链接onPageChanged
到重建页面
在. onPageChanged
_PageView
onPageChanged
只是运行我们给它的任意函数,仅此而已。
如果我们希望重建页面,onPageChanged
我们需要自己创建该链接。
与ValueNotifier
/链接ValueListenableBuilder
在此示例中,我们使用ValueNotifier
(buildCount
变量) 来通知在更改ValueListenableBuilder
时进行重建buildCount
。(有关信息,请参阅Flutter 文档。)
每次我们滑动页面时,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)),
),
);
},
),
);
}
}
为了根据您的目的调整此示例,您将替换Widget的builder:
部分。ValueListenableBuilder
它将在每次滑动时重建。
附录
如果您想知道滑动手势期间页面的精确位置,我们可以提供PageController
to PageView
,将侦听器附加到该控制器,然后侦听controller.page
输出:
class PageViewRebuildExample extends StatefulWidget {
@override
_PageViewRebuildExampleState createState() => _PageViewRebuildExampleState();
}
// Switched to StatefulWidget so we can add listener & dispose
class _PageViewRebuildExampleState extends State<PageViewRebuildExample> {
final List<String> contents = ['One', 'Two', 'Three'];
final ValueNotifier<int> buildCount = ValueNotifier<int>(0);
final PageController controller = PageController(); // ← our new controller
@override
void initState() {
super.initState();
controller.addListener(() { // ← add a listener in onInit
print('Precise page position ${controller.page}');
});
}
@override
void dispose() {
controller.dispose(); // don't forget to dispose
super.dispose();
}
@override
Widget build(BuildContext context) {
print('Example built');
return Center(
child: PageView.builder(
itemCount: contents.length,
controller: controller, // ← PageController provided here
onPageChanged: (page) {
print('PageChanged $page');
buildCount.value++;
},
上面示例监听器的输出是(剪短):
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
1可能有许多其他方法可以做到这一点,这只是一种方法。例如,Stream
用于将事件从内部发送onPageChanged
到StreamBuilder
内部itemBuilder
是另一回事。
推荐阅读
- vba - 访问 - 我的 VBA 代码是否截断了我的文本框?
- android - Android Retrofit + Moshi,从响应中检索嵌套数据
- powerbi - 如何使用 Power Automate 将包含数百万行的表中的所有数据从 Power BI 导出到 csv?
- javascript - 如何在javascript中划分多个数组
- ansible - ansible playbook 用于检查目标主机的服务器可达性
- reactjs - React - 将道具传递给特定的孩子
- julia - 在 Julia 中的同一图形上绘制多个 ODE 解决方案的最佳方法是什么?
- javascript - 如何将上传的图片插入位于另一张图片上的框架中?
- clang - 为 WebAssembly 创建程序集数据部分
- php - imagick 只保存 gif 的第一帧