Flutter 如何在Flatter中处理/终止页面视图中的页面

Flutter 如何在Flatter中处理/终止页面视图中的页面,flutter,flutter-layout,Flutter,Flutter Layout,我有一个包含两个页面的页面视图,两个页面的每个页面都有一个自定义导航器堆栈 在初始开始时(假设我在第1页上开始),第2页是在我开始滚动或跳转到它时构建的(正常情况下) 我想当我在第2页,回到第1页,反之亦然,这些页面保持活动状态,我想处置/杀死它们以强制重建..至少在第2页 我尝试了wantKeepAlive=false,但没有成功 有人可以分享一种方法来实现这一点。刷卡重建 如果目标是告诉我们的小部件在页面被来回滑动时重建,我们可以使用PageView.builder的onPageChange

我有一个包含两个页面的页面视图,两个页面的每个页面都有一个自定义导航器堆栈

在初始开始时(假设我在第1页上开始),第2页是在我开始滚动或跳转到它时构建的(正常情况下)

我想当我在第2页,回到第1页,反之亦然,这些页面保持活动状态,我想处置/杀死它们以强制重建..至少在第2页

我尝试了
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