我已经为我遇到的这个问题构建了一个小测试示例。您可以从下面的 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/
我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编
在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,
一、环境变量右键点击我的电脑-属性:然后找到环境变量 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 变量
我想知道:在Ruby中,有没有一种方法可以在不使用其名称的情况下从自身内部调用方法?如果该方法是通过某些元编程技术创建的,那么通过其名称调用它可能会难以阅读。即使对于通常定义的方法,如果您不确定它的好名字,或者如果它的名字很长,通过一些关键字(类似于super)从自身内部调用它可能会很方便。 最佳答案 您可以使用Kernel#__method__以Symbol形式返回当前方法的名称。与super不同,它不是关键字而是常规方法,因此您必须将它连同必需的参数一起传递给send方法才能调用该方法。这是__method__返回的内容:obj
大家。我有一个想法使用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#
因此,我们的页面中有以下代码:OnOff这是2个单选按钮。'开和关'。“关闭”是默认值。使用Watir-webdriver和Ruby,我们想要选择“打开”单选按钮。我们这样做:browser.radio(:id=>"HasRegistration_true").set但在这样做时,我们得到以下错误:`WebElement.clickElement':Elementcannotbescrolledintoview:[objectHTMLInputElement](Selenium::WebDriver::Error::MoveTargetOutOfBoundsError)我们知道Sele
我的应用程序有几个需求,使用edgeRails(3.1)可以帮助我更快地完成任务。问题是我依赖的其中一个gem还没有正式支持Rails3.1,它有一个“~>3.0.0”的railties依赖,这会造成依赖冲突,并且bundler无法解决我的依赖.我能否以某种方式在我的应用程序的Gemfile中覆盖该要求,或者这是我fork依赖项的唯一解决方法? 最佳答案 可悲的是,分支它是解开它的唯一方法。或者,更hacky,修改gem的/vendor本地安装。 关于ruby-on-rails-在Bun
我想更改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的值。它总是指向当前对象,你不能让它指向别的东西。当
我自己扩展了Kernel,在实例方法Kernel#abort的定义中,我调用了单例方法Kernel.abort:moduleKernelextendselfdefabortputs"PressENTERtoexit..."getsKernel.abortendendabort当我调用Kernel#abort时,方法定义中的Kernel.abort调用似乎是指原始的Kernel#abort(扩展为Kernel.abort)。Ruby如何知道当我写Kernel.abort时,我指的是原始的abort方法,而不是我刚刚创建的方法?我将如何递归调用我刚刚创建的新abort方法?
我正在尝试滚动网页以查找并单击滚动页面时延迟加载的内容。我正在使用以下命令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