为啥在 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 端实现的角度来看,我知道 PlatformViewRenderBoxsizedByParent 函数被覆盖为 true。因此,它从父级获取约束,不测量自身,并填充它获得的任何空间。

我不明白的是,既然 Android 端有“WRAP_CONTENT”,那么他们无法在 Flutter 中将 PlatformView 缩小到自己的大小的原因是什么?有哪些技术困难/折衷方案?

【问题讨论】:

你是发送设计UI图片 【参考方案1】:

如果您在 constraints 独立宽度中使用 Flex(Row/Column),例如如果您不向容器提供 width/height,那么它的孩子有权决定多少Row/Column 中要覆盖的空间 我们有一个名为 ma​​inAxisSize 的属性,默认情况下它设置为 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 中没有收到通知?

为啥我的 Flutter 应用中的 FAB 很大?

在 FLUTTER/DART 中,为啥我们有时在声明变量的时候会在“String”后面加上问号?

带有项目的地图中的返回语句:在 Flutter DropdownButton 中,为啥以及如何工作