草庐IT

Flutter:SliverPersistentHeader 在滚动时重建自身

coder 2023-05-10 原文

我已经为我遇到的这个问题构建了一个小测试示例。您可以从下面的 gif 中看到 Flutter 应用程序的顶部只有一个标题。当我下拉刷新时,标题不会自行重建。但是,当我向上插入页眉时,页眉会自行重建多次。另请注意,我没有在我的代码中的任何地方调用 setState(),因此我不确定当我向上插入 ScrollView 时它如何知道它需要重建自身。

我想 header 完全不重建自己,因为没有理由它应该重建自己。它是静态/无状态的,根本不应该改变。 header 的大小也不应更改(因此 expandedHeight 和 collapsedHeight 在 136.0 时相同)。

这是我用来重新创建此代码的示例代码:

import 'package:meta/meta.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'dart:math' as math;
import 'dart:async';

class _TestHeader extends SliverPersistentHeaderDelegate {
  _TestHeader({
    @required this.collapsedHeight,
    @required this.expandedHeight,
    @required this.showHeading,
  });

  bool showHeading;
  final double expandedHeight;
  final double collapsedHeight;

  @override
  double get minExtent => collapsedHeight;

  @override
  double get maxExtent => math.max(expandedHeight, minExtent);

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    print("rebuilding headings");
    return new SafeArea(
        child: Column(children: <Widget>[
      const SizedBox(height: 24.0),
      new GestureDetector(
        onTap: () {
        },
        child: new Container(
          decoration: const BoxDecoration(
            color: CupertinoColors.white,
            border: const Border(
              top: const BorderSide(color: const Color(0xFFBCBBC1), width: 0.0),
              bottom:
                  const BorderSide(color: const Color(0xFFBCBBC1), width: 0.0),
            ),
          ),
          height: 44.0,
          child: new Padding(
            padding:
                const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
            child: new SafeArea(
              top: false,
              bottom: false,
              child: new Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: const <Widget>[
                  const Text(
                    'This is my heading',
                    style: const TextStyle(color: CupertinoColors.activeBlue, fontSize: 16.0),
                  )
                ],
              ),
            ),
          ),
        ),
      ),
    ]));
  }

  @override
  bool shouldRebuild(@checked _TestHeader oldDelegate) {
//    return false;
    return expandedHeight != oldDelegate.expandedHeight ||
        collapsedHeight != oldDelegate.collapsedHeight;
  }
}

class TestHeaderPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new TestHeaderState();
  }
}


class TestHeaderState extends State<TestHeaderPage> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new CupertinoPageScaffold(
      //i will need to convert this to a sliver list to make this work properly.
        backgroundColor: const Color(0xFFEFEFF4),
        navigationBar: new CupertinoNavigationBar(
          middle: new Text('Test Headers'),
        ),
        child: new SafeArea(
          child: new CustomScrollView(slivers: <Widget>[
            new CupertinoRefreshControl(onRefresh: () {
              print("pulling on refresh");
              return Future<void>(() {});
                }),
            new SliverPersistentHeader(
                delegate: new _TestHeader(
                    collapsedHeight: 136.0,
                    expandedHeight: 136.0,
                    showHeading: true)),
          ]),
        ));
  }

}

最佳答案

这是完全正常的。

您的 _TestHeader 不是小部件。仅仅因为它有 build 方法并不意味着它就是一个。 :)

您扩展了 SliverPersistentHeaderDelegate,它用于构建 SliverPersistentHeader

问题是:SliverPersistentHeader 也不是小部件。它是一个条子,这是一种在屏幕上呈现内容的不同方式。

而且,在 SliverPersistentHeader 的情况下,它是一种特定类型的 sliver,每当滚动偏移发生变化时就会重建。也就是说,可能会处理特定于滚动的动画。 例如向上滚动使标题消失。并向下滚动以使其弹回。

关于Flutter:SliverPersistentHeader 在滚动时重建自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50161101/

有关Flutter:SliverPersistentHeader 在滚动时重建自身的更多相关文章

  1. ruby - 一种语言如何被自身解释(如 Rubinius)? - 2

    我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编

  2. 驱动开发:内核无痕隐藏自身分析 - 2

    在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,

  3. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值        D:\Flutter\flutter\bin             这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量:        变量名:FLUTTER_STORAGE_BASE_URL      变量值:https://storage.flutter-io.cn        变量名:PUB_HOSTED_URL      变量

  4. Ruby:是否有关键字可以从自身内部调用方法(类似于 super)? - 2

    我想知道:在Ruby中,有没有一种方法可以在不使用其名称的情况下从自身内部调用方法?如果该方法是通过某些元编程技术创建的,那么通过其名称调用它可能会难以阅读。即使对于通常定义的方法,如果您不确定它的好名字,或者如果它的名字很长,通过一些关键字(类似于super)从自身内部调用它可能会很方便。 最佳答案 您可以使用Kernel#__method__以Symbol形式返回当前方法的名称。与super不同,它不是关键字而是常规方法,因此您必须将它连同必需的参数一起传递给send方法才能调用该方法。这是__method__返回的内容:obj

  5. ruby-on-rails - Rails 的 Activerecord 表如何引用自身? - 2

    大家。我有一个想法使用Activerecord来实现一些奇怪的东西,如下例所示:SystemInfo想法是,系统A可以包含系统B作为其子系统。所以我将生成应用程序的框架:script/generatescaffoldSystemInfoparent_id:integername:string然后,当我插入系统A时,我将使用系统A的ID作为系统B的parent_id(系统A的parent_id将等于'nil'。当我使用这样的命令时:sysA=SystemInfo.find_by_id(1)#GetSystemA我认为这有可能得到系统A,它是子系统B。类似于:sysA.childrens#

  6. ruby - 绕过 Element 的方法无法滚动到 View 中 - Watir-webdriver with Ruby - 2

    因此,我们的页面中有以下代码:OnOff这是2个单选按钮。'开和关'。“关闭”是默认值。使用Watir-webdriver和Ruby,我们想要选择“打开”单选按钮。我们这样做:browser.radio(:id=>"HasRegistration_true").set但在这样做时,我们得到以下错误:`WebElement.clickElement':Elementcannotbescrolledintoview:[objectHTMLInputElement](Selenium::WebDriver::Error::MoveTargetOutOfBoundsError)我们知道Sele

  7. ruby-on-rails - 在 Bundler 中,如何覆盖依赖项对其自身依赖项的版本要求? - 2

    我的应用程序有几个需求,使用edgeRails(3.1)可以帮助我更快地完成任务。问题是我依赖的其中一个gem还没有正式支持Rails3.1,它有一个“~>3.0.0”的railties依赖,这会造成依赖冲突,并且bundler无法解决我的依赖.我能否以某种方式在我的应用程序的Gemfile中覆盖该要求,或者这是我fork依赖项的唯一解决方法? 最佳答案 可悲的是,分支它是解开它的唯一方法。或者,更hacky,修改gem的/vendor本地安装。 关于ruby-on-rails-在Bun

  8. Ruby 并为 Float 实例修改自身 - 2

    我想更改float实例的self值。我有以下方法:classFloatdefround_by(precision)(self*10**precision).round.to_f/10**precisionendend我想添加round_by!修改自身值的方法。classFloatdefround_by!(precision)self=self.round_by(precision)endend但是我得到一个错误,说我不能改变self的值。有什么想法吗? 最佳答案 您不能更改self的值。它总是指向当前对象,你不能让它指向别的东西。当

  9. ruby - 在扩展自身的模块中的实例方法中调用单例方法 - 2

    我自己扩展了Kernel,在实例方法Kernel#abort的定义中,我调用了单例方法Kernel.abort:moduleKernelextendselfdefabortputs"PressENTERtoexit..."getsKernel.abortendendabort当我调用Kernel#abort时,方法定义中的Kernel.abort调用似乎是指原始的Kernel#abort(扩展为Kernel.abort)。Ruby如何知道当我写Kernel.abort时,我指的是原始的abort方法,而不是我刚刚创建的方法?我将如何递归调用我刚刚创建的新abort方法?

  10. ruby - 如何使用 watir 滚动网页 - 2

    我正在尝试滚动网页以查找并单击滚动页面时延迟加载的内容。我正在使用以下命令require'watir-webdriver'@browser=Watir::new:firefox@browser.send_keys:space我在firefox上使用网络驱动程序,我在ubuntu上,但它不工作。在下面的ruby​​代码中,我试图向下滚动页面,直到找不到带有:id的元素。该元素正在延迟加载。几秒钟后我超时了,不知道下面的代码有什么问题。When/^deal(\d+)isloaded$/do|id|(0..5).eachdo|click|@browser.send_keys:spaceend

随机推荐