为啥在 Flutter 中,PlatformView 不能缩小到自己的大小?
Posted
技术标签:
【中文标题】为啥在 Flutter 中,PlatformView 不能缩小到自己的大小?【英文标题】:Why in Flutter, PlatformView cannot shrink to its own size?为什么在 Flutter 中,PlatformView 不能缩小到自己的大小? 【发布时间】:2022-01-19 09:57:51 【问题描述】:例如:
child: Row(
children: [
const Expanded(child: androidNativeView()),
ElevatedButton(
child: const Text("PLUS"))
],
)
在像 Flex(Row/Column) 这样没有父约束的布局中,AndroidNativeView (a PlatformViewLink) 无法确定其大小,因此将引发异常。因此,即时解决方案将其包装在 Expanded/Flexible 或具有硬编码宽度/高度的类似容器的小部件中。两种解决方案的布局都不灵活。
从当前 Dart 端实现的角度来看,我知道 PlatformViewRenderBox
的 sizedByParent
函数被覆盖为 true。因此,它从父级获取约束,不测量自身,并填充它获得的任何空间。
我不明白的是,既然 Android 端有“WRAP_CONTENT”,那么他们无法在 Flutter 中将 PlatformView 缩小到自己的大小的原因是什么?有哪些技术困难/折衷方案?
【问题讨论】:
你是发送设计UI图片 【参考方案1】:如果您在 constraints
独立宽度中使用 Flex(Row/Column),例如如果您不向容器提供 width/height
,那么它的孩子有权决定多少Row/Column 中要覆盖的空间 我们有一个名为 mainAxisSize 的属性,默认情况下它设置为 MainAxisSize.max 但您可以设置也将其设置为最小,然后 Row/Column 还将覆盖其children
所需的任何空间。
但是,如果您将 constraints
提供给 parent widget
,那么您已经知道,在 Flutter 中,约束是父子关系,因此它将涵盖所有可用的 space
。
【讨论】:
flutter的一般布局规则不适用于PlatformView的情况,mainAxisSize:min参数也不起作用。它会在运行时说:“RenderConstrainedBox 对象在布局期间被赋予了无限大小。这可能意味着它是一个试图尽可能大的渲染对象,但它被放在另一个渲染对象中,允许其子级选择他们的自己的大小”。问题是关于 Flutter 原生的互操作实现,而不是纯粹的 Flutter 布局机制。 RenderConstrainedBox 对象在布局期间被赋予了无限大小。当您在 Listview 类型对象中添加列/行时会出现此错误,并且如果您使用 shrinkwrap 它也将得到解决并且 mainAxisSize: min 有效,这就是它们存在的原因您的用例可能不同,但这并不意味着该属性没有不工作以上是关于为啥在 Flutter 中,PlatformView 不能缩小到自己的大小?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Flutter 中的 Form 需要 GlobalKey?
为啥 Text 小部件已经在 Flutter 中预定义了样式?
为啥在 Flutter 中使用 firebase_messaging 插件在 ios 中没有收到通知?