- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个屏幕,其中包含一个 Form
与 StreamBuilder
.当我从 StreamBuilder
加载初始数据时, TextFormField
按预期显示数据。
当我点击 TextFormField
,软件键盘出现,这会导致小部件重建。当键盘再次按下时,同样的情况再次发生。
不幸的是,StreamBuilder
再次订阅,文本框值被替换为初始值。
这是我的代码:
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _bloc.inputObservable(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return TextFormField(
// ...
);
}
return const Center(
child: CircularProgressIndicator(),
);
},
);
}
我该如何解决这个问题?
最佳答案
导致重建的键盘
它使 总感和 预计软件键盘打开导致重建。在幕后,MediaQuery
是 updated with view insets .这些 MediaQueryData.viewInsets
确保您的 UI 知道键盘遮挡了它。抽象地说,遮挡屏幕的键盘会导致窗口发生变化,并且大部分时间会导致您的 UI 发生变化,这需要对 UI 进行更改 - 重建。
我可以自信地猜测您正在使用 Scaffold
在您的 Flutter 应用程序中。像许多其他框架小部件一样,Scaffold
小部件 取决于 (参见 InheritedWidget
)在 MediaQuery
上(从包含您的应用程序的 Window
获取其数据)使用 MediaQuery.of(context)
.
见 MediaQueryData
想要查询更多的信息。
这一切都归结为 Scaffold
依赖于 View 插入。这允许它调整大小 当这些 查看插图 改变。基本上,当键盘打开时, View 插入更新,这允许脚手架在底部收缩,去除被遮挡的空间。
长话短说,适应调整后的 View 插入的脚手架需要重新构建脚手架 UI。并且由于您的小部件必然是脚手架的子项(可能是 body
),因此您的小部件也会在发生这种情况时重建。
您可以使用 Scaffold.resizeToAvoidBottomInset
禁用 View 插入调整大小行为.但是,这不一定会停止重建,因为可能仍然依赖于 MediaQuery
.我将在下面解释你应该如何真正思考这个问题。
幂等构建方法
您应该始终以 build
的方式构建您的 Flutter 小部件。方法是 幂等 .
范例是构建调用可以在任何时间点发生,每秒最多 60 次(如果刷新率更高,则可能更多)。
我所说的幂等构建调用的意思是,当您的小部件配置(在 StatelessWidget
s 的情况下)或您的状态(在 StatefulWidget
s 的情况下)没有任何变化时,生成的小部件树应该是 完全一样 .因此,您不想处理 build
中的任何状态。 - 它的唯一职责应该是代表当前的配置或状态。
导致重建的软件键盘打开只是一个很好的例子,说明为什么会这样。其他示例是旋转设备、在 Web 上调整大小,但随着您的小部件树开始变得复杂,它实际上可以是任何东西(更多内容见下文)。StreamBuilder
重新订阅重建
回到最初的问题:在这种情况下,您的问题是您正在接近 StreamBuilder
不正确。您应该不是 给它一个流 重新创建 每个构建。
流构建器的工作方式是订阅初始流,然后在流更新时重新订阅。这意味着当 stream
StreamBuilder
的属性(property)两个小部件不同 build
调用,流构建器将取消订阅第一个流并订阅第二个(新)流。
您可以在 _StreamBuilderBaseState.didUpdateWidget
implementation 中看到这一点:
if (oldWidget.stream != widget.stream) {
if (_subscription != null) {
_unsubscribe();
_summary = widget.afterDisconnected(_summary);
}
_subscribe();
}
这里显而易见的解决方案是您需要提供
同一流 当您不想重新订阅时,在不同的构建调用之间。这可以追溯到幂等构建调用!
StreamController
例如将始终返回相同的流,这意味着使用
stream: streamController.stream
是安全的。在您的
StreamBuilder
.基本上,所有 Controller 、行为主体等实现都应该以这种方式运行 - 只要您不是
重建您的信息流,
StreamBuilder
会好好照顾的!
_bloc.inputObservable()
,它每次都会创建一个新流,而不是返回相同的流。
关于flutter - 为什么软件键盘会在打开/关闭时导致小部件重建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56313800/
我想向一些用户公开一个 Web 部件,但不是所有用户。如何在“添加 Web 部件”弹出窗口中显示或隐藏 Web 部件?我想通过代码来做到这一点,我希望使用 SharePoint 角色来实现这一点。 最
我无法创建两个以上的 StatusBar 部分: HWND hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, "", WS_CHILD | WS_VISI
使用 SharePoint 2007,如何在编辑页面模式下允许将 CEWP 添加到“添加 Web 部件”对话框的选择菜单?目前,我只能添加公告、日历、链接、共享文档、任务,但我无法添加 CEWP。我可
哪个 Web 部件以及如何配置它以查看来自不同网站集的列表? 请注意,我不想查看页面,而是查看列表。例如,在单独的网站集下查看来自不同团队网站的公告。 预先感谢您的帮助。 最佳答案 Data Form
以下是我在 FeatureDeactivation 事件处理程序中添加的代码片段。我无法获得删除 System.Web.UI.WebControls.WebParts 类型的 webpart 的解决方
我一直在尝试跟踪来自以下方面的信息: Long URL clipped to stop breaking the page 和 http://msdn.microsoft.com/en-us/libr
我想创建一个自定义 Web 部件,它具有 1 个以上的筛选器 Web 部件,并且可以在运行时/设计时连接到报表查看器 Web 部件(集成模式)。 我为此搜索了很多,但找不到一种方法来让单个 Web 部
我正在尝试创建一个 Web 部件,使用户无需离开 AllItems.aspx 页面即可编辑项目。 Web 部件应具有与 EditForm.aspx 页面类似的功能。 我已经使用 ConnectionC
这些年发布的许多应用程序都有新的 GUI 部件。iTunes 或 Twitter.app 中垂直布局的最小、最大和关闭按钮(但最新的具有默认布局),Safari 和终端中的选项卡控件,GarageBa
在具有数据库依赖性的 WSS3 或 MOSS2007 中部署 Web 部件的最佳方法是什么? .wsp 是否应该包含创建数据库的代码,我应该将 .wsp 封装在另一个处理数据库创建的安装程序中,还是应
我在我们位于 http://sharepoint:12345 的 moss 服务器上创建了一个新的共享点站点并毫无问题地向其添加了 CQWP。 我有一个指向同一台服务器的域名。所以我指向了http:/
在官方 Office 2007 站点中有许多对筛选器 Web 部件的引用。当我尝试添加其中之一时,我的 Sharepoint 中的 Web 部件列表没有显示任何筛选器 Web 部件。 如果有人遇到相同
我被要求在 Sharepoint 中创建一个 Web 部件,列出用户在网站集中访问的最后 10 个文档。 我的客户想要一种快速的方式让用户访问文档,这样他们就不必翻遍文件夹结构来查找文档,因为大多数时
我需要使用 C# 以编程方式将 SharePoint Web 部件“站点用户”添加到页面。 我知道如何添加 Web 部件,但如何从 Share Point 获取“站点用户”Web 部件?我不知道如何实
我正在使用 MEF 在我的应用程序中加载插件。一切正常,但我希望在将新部件放入我的应用程序文件夹时发现它们。这可能吗? DirectoryCatalog 有一个 Changed 事件,但我不确定它是如
我有一个 Winforms 桌面应用程序正在加载具有相同接口(interface)类型的多个 MEF 部件。 问题:当我尝试加载多个相同类型时,出现以下异常: 组成保持不变。由于以下错误,更改被拒绝:
我有一个内容查询 Web 部件,它按内容类型对网站集进行查询。我已按内容类型对其进行了分组,因此我有: -- Agenda (Content Type) ----Agenda #1 ----Agend
考虑以下 SharePoint 站点层次结构: - Site Collection - Site1 - Subsite1 - AnotherSubsite1
好吧,在我的 SharePoint (2013) 网站中,我制作了一个简单的 JavaScript Web 部件,每五分钟刷新一次页面。我去调整时间,在刷新前输入等待时间的地方退格,然后不假思索地退出
我不知道 Sharepoint 脚本,我的同事也不知道 JavaScript。他使用了他在 http://www.wonderlaura.com/Lists/Posts/Post.aspx?ID=22
我是一名优秀的程序员,十分优秀!