fluttercandies / extended_text

A powerful extended official text for Flutter, which supports Speical Text(Image,@somebody), Custom Background, Custom overFlow, Text Selection.
MIT License
664 stars 134 forks source link

ExtendedText文本渲染错位 #117

Closed blueloveTH closed 1 year ago

blueloveTH commented 3 years ago

下图激活selection,可以看到,选中的位置和文本真实位置有一点错位,随着文本行数不断增加,这种错位逐渐累计,变得越来越明显。

Screenshot_2021-09-13-01-53-35-028_com example ex

该问题的复现方法:

import 'package:extended_text/extended_text.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("测试"),),
      body: ListView(
        children: [
          ExtendedText(
            "测试测试测试 ----\n   1123\n"*100,
            selectionEnabled: true,
            style: TextStyle(fontSize: 14),
          )
        ],
      ),
    );
  }
}

版本:Flutter 2.2.3 平台:Android(Windows似乎没有这个问题)

此外,ExtendedTextField也没有这个问题

zmtzawqlp commented 3 years ago

等官方重构之后,我会重新也重构新的,暂时不做处理了。

blueloveTH commented 3 years ago

等官方重构之后,我会重新也重构新的,暂时不做处理了。

啊....那要啥时候更新呀> < 现在有什么workaround吗

zmtzawqlp commented 3 years ago

官方的会吗

blueloveTH commented 3 years ago

官方的会吗

官方是指啥,我的项目用了ExtendedTextField和SpecialSpanBuilder,有办法兼容这些吗。

是在做一个类似论坛的显示,不可避免有长文本,所以挺着急的。错位之后,图片的显示也都不正常。

zmtzawqlp commented 3 years ago

官方就是flutter 官方的呢

shidenggui commented 2 years ago

@zmtzawqlp 官方的不会,我的一款 App 元思笔记之前为了支持 Markdown 的渲染后拷贝切换到了 ExtendedText 后也遇到了,文本越长渲染偏差越明显。

shidenggui commented 2 years ago

请问下这个问题有计划解决吗?如果有的话不知道有没有大概的时间表。

zmtzawqlp commented 2 years ago

你看看最新的版本也有这个问题吗。。这个问题不好调查。。整个绘制其实是 textpainter做的

blueloveTH commented 2 years ago

亲测把ExtendedRichText换成官方的Text.rich没有这个问题。

// extended_text.dart
// ...
    Widget result;
    if (selectionEnabled) {
      /*
      result = ExtendedTextSelection(
        textAlign: textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,
        textDirection: textDirection ??
            Directionality.of(
                context), // RichText uses Directionality.of to obtain a default if this is null.
        locale:
            locale, // RichText uses Localizations.localeOf to obtain a default if this is null
        softWrap: softWrap ?? defaultTextStyle.softWrap,
        overflow: overflow ?? defaultTextStyle.overflow,
        textScaleFactor:
            textScaleFactor ?? MediaQuery.textScaleFactorOf(context),
        maxLines: maxLines ?? defaultTextStyle.maxLines,
        text: innerTextSpan,
        selectionColor: selectionColor,
        dragStartBehavior: dragStartBehavior,
        onTap: onTap,
        data: (joinZeroWidthSpace ? data?.joinChar() : data) ??
            textSpanToActualText(innerTextSpan),
        textSelectionControls: selectionControls,
        textHeightBehavior:
            textHeightBehavior ?? defaultTextStyle.textHeightBehavior,
        textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,
        overFlowWidget: overflowWidget,
        strutStyle: strutStyle,
      );
      */
    } else {
      /*
      result = ExtendedRichText(
        textAlign: textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,
        textDirection: textDirection ??
            Directionality.of(
                context), // RichText uses Directionality.of to obtain a default if this is null.
        locale:
            locale, // RichText uses Localizations.localeOf to obtain a default if this is null
        softWrap: softWrap ?? defaultTextStyle.softWrap,
        overflow: overflow ?? defaultTextStyle.overflow,
        textScaleFactor:
            textScaleFactor ?? MediaQuery.textScaleFactorOf(context),
        maxLines: maxLines ?? defaultTextStyle.maxLines,
        text: innerTextSpan,
        textHeightBehavior:
            textHeightBehavior ?? defaultTextStyle.textHeightBehavior,
        textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,
        overflowWidget: overflowWidget,
        hasFocus: false,
        strutStyle: strutStyle,
      );
      if (overflowWidget != null) {
        result = RepaintBoundary(
          child: result,
        );
      }
      */
    }

    /*
    if (semanticsLabel != null) {
      result = Semantics(
        textDirection: textDirection,
        label: semanticsLabel,
        child: ExcludeSemantics(
          child: result,
        ),
      );
    }*/

    result = Text.rich(
      innerTextSpan,
      style: style,
      strutStyle: strutStyle,
      textAlign: textAlign ?? defaultTextStyle.textAlign ?? TextAlign.start,
      textDirection: textDirection ??
          Directionality.of(
              context), // RichText uses Directionality.of to obtain a default if this is null.
      locale: locale, // RichText uses Localizations.localeOf to obtain a default if this is null
      softWrap: softWrap ?? defaultTextStyle.softWrap,
      overflow: overflow ?? defaultTextStyle.overflow,
      textScaleFactor: textScaleFactor ?? MediaQuery.textScaleFactorOf(context),
      maxLines: maxLines ?? defaultTextStyle.maxLines,
      textWidthBasis: textWidthBasis ?? defaultTextStyle.textWidthBasis,
      textHeightBehavior: textHeightBehavior ?? defaultTextStyle.textHeightBehavior,
    );

    return result;
  }
zmtzawqlp commented 2 years ago

我试了下。当内容很长的时候。官方也会出现这个问题。

zmtzawqlp commented 1 year ago

please check it on lastest version, reopen if need.