dart 将WidgetSpan添加到TextField会导致“dimensions!= null ':不为真'

lb3vh1jj  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(212)

我一直在尝试将WidgetSpans添加到TextField(通过TextEditingController中的buildTextSpan())并遇到崩溃:“Assert失败:[..]:‘维度!= null ':不为真”。在试图找到一个解决方案时,我只遇到了有类似问题的人,但没能找到解决方案。我的代码(和问题)类似于问题www.example.com上发布的评论https://github.com/flutter/flutter/issues/30688#issuecomment-870034058。

@override
  TextSpan buildTextSpan({required BuildContext context, TextStyle? style, required bool withComposing}) {
    final atIndex = text.indexOf('@');
    var spans = <InlineSpan>[];

    if (atIndex != -1) {
      spans.add(TextSpan(text: text.substring(0, atIndex)));
      spans.add(
        WidgetSpan(
          alignment: PlaceholderAlignment.middle,
          child: Card(
            child: Padding(
              padding: const EdgeInsets.all(4.0),
              child: Text('@'),
            ),
          ),
        ),
      );
      spans.add(TextSpan(text: text.substring(1 + atIndex)));
    } else {
      spans.add(TextSpan(text: text));
    }

    return TextSpan(
      children: spans,
    );
  }

对于此失败的Assert是否有任何修复/解决方法?

kpbpu008

kpbpu0081#

事实证明,这一功能目前还不在稳定通道中。使用主通道“修复”了这个问题,使提供的代码片段无需修改即可运行。
有关更改频道的信息,请参阅:https://stackoverflow.com/a/61157330/10832540

zvms9eto

zvms9eto2#

如果您可以通过设置PlaceholderDimensions来解决问题,请尝试以下操作。“dimensions”的长度和顺序必须与“PlaceholderSpan”的编号相同。您的'buildTextSpan'方法中只有一个'WidgetSpan'。因此,“dimensions”中只包含一个“PlaceholderDimension

List<PlaceholderDimensions> dimensions = [
  const PlaceholderDimensions(
      size: Size(8+?, 8+?) //size of yout WidgetSpan
      , alignment: PlaceholderAlignment.middle,
  )
];

final textPainter = TextPainter(
    text : buildTextSpan(...),
)..setPlaceholderDimensions(dimensions)

相关问题