0

我的应用程序中有文本,我想随着时间的推移使用不同的颜色。我通过使用 RichText 小部件来做到这一点,每个字符都有一个单独的文本跨度和一个计时器,然后将更新状态并适当地重新绘制所有文本跨度。只要文本不太长,它就可以工作。它开始在大约 7-10k 个字符的文本中中断。

为了优化这一点,我决定使用 VisibilityDetector 库,因为不可见的文本不需要使用不同的颜色。因此,我将文本分块并将每个块放入其自己的可见性检测器中,当它不可见时,我只需使用 Text 小部件设置文本。这可行,但由于它们是单独的小部件,因此一行将在中途被切断并从下一行开始。

我想做的是将 TextSpan 作为 VisibilityDetector 的子项传递,但这会产生错误TextSpan is not a subtype of the type Widget。有什么办法可以做我想做的事吗?

这是我想要的小部件树类型:

String myText = '';

RichText(
    text: TextSpan(
        children: myText.chunk().mapIndexed((chunkIndex, chunkText) {
            return WidgetSpan(
                child: VisibilityDetector(
                    onVisibilityChanged: (info) => _handleVisibilityChanged(),
                    child: !chunkIsVisible ? 
                        Text(chunkText) :
                        TextSpan( //This breaks because its not a subtype of Widget
                            children: chunkText.characters.mapIndexed((charIndex, char) {
                                return TextSpan(
                                    text: char,
                                    style: _styleTextBasedOnIndex((chunkIndex * ChunkSize) + charIndex)
                                )
                            }
                        )
                )
            )
        }
    )
)
4

1 回答 1

0

我认为你可以这样做来传递错误:

String myText = '';

RichText(
    text: TextSpan(
        children: myText.chunk().mapIndexed((chunkIndex, chunkText) {
            return WidgetSpan(
                child: VisibilityDetector(
                    onVisibilityChanged: (info) => _handleVisibilityChanged(),
                    child: !chunkIsVisible ? 
                        Text(chunkText) :
                        RichText(text: TextSpan( // Use another RichText
                            children: chunkText.characters.mapIndexed((charIndex, char) {
                                return TextSpan(
                                    text: char,
                                    style: _styleTextBasedOnIndex((chunkIndex * ChunkSize) + charIndex)
                                )
                            }
                        )
                   )
              )
            )
        }
    )
)
于 2021-10-13T03:36:22.400 回答