【问题标题】:How to respect carriage return (CR) from List<int> into String in dart/flutter如何在 dart/flutter 中将 List<int> 中的回车符 (CR) 转换为 String
【发布时间】:2021-03-15 10:23:05
【问题描述】:

我正在尝试将 List 转换为 String 并在 Flutter 的 Text 小部件中显示它,但它没有按预期工作。以下片段:

import 'dart:convert' show utf8;

List<int> val = [49, 46, 13, 104, 101, 108, 108, 111];
final decoded = utf8.decode(val);


....

Container(
    child: Text(decoded)
)

文字显示:

  1. 你好

应该是:

1.
你好

为什么不尊重13(相当于回车)?

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    尝试使用LineSplitterString 拆分为行列表,然后使用StringBuffer 再次组合这些行:

    import 'dart:convert' show utf8, LineSplitter;
    
    void main() {
      final val = [49, 46, 13, 104, 101, 108, 108, 111];
      final lines = const LineSplitter().convert(utf8.decode(val));
      print(lines); // [1., hello]
    
      final message = lines
          .fold<StringBuffer>(
              StringBuffer(), (buffer, line) => buffer..writeln(line))
          .toString();
      print(message);
      // 1.
      // hello
    }
    

    这将确保您使用的是运行平台支持的行尾。

    如果可行,可以缩短为:

    import 'dart:convert' show utf8, LineSplitter;
    
    void main() {
      List<int> val = [49, 46, 13, 104, 101, 108, 108, 111];
    
      final decoded = utf8.decode(val);
      print(decoded);
    
      final fixed = fixNewLines(decoded);
      print(fixed);
    }
    
    String fixNewLines(String text) => const LineSplitter()
        .convert(text)
        .fold<StringBuffer>(StringBuffer(), (buffer, line) => buffer..writeln(line))
        .toString();
    

    【讨论】:

    • 谢谢。这行得通。我尝试使用 buffer..write() 而不是 writeln,但它不再起作用了。所以这让我相信,它的作用是分割字符串,然后在使用 writeLn 时在每个字符串的末尾用 \n 再次连接它们。因此列表 (13) 中的第三个字符串将变为 (\r\n)。这就是它起作用的原因。所以我尝试了 utf8.decode(val).split('\r').join('\n') 并且它也工作得很好。与 LineSplitter 相比,您认为使用此解决方案是否更好?
    • 好吧,这取决于你。` LineSplitter` 将采用任何\n 和/或\r 并将其用于拆分。因此,如果您有一些混合输入,则此解决方案很好。如果您确定您的字符串将始终只包含\r,那么拆分解决方案非常棒。
    • 是的,你是对的。您的解决方案更强大。谢谢!
    【解决方案2】:

    由于某些原因,Flutter 会寻找 LF 换行并忽略 CR。如果您将 13 (CR) 替换为 10 (LF) 它将起作用。

    我不知道这是错误还是平台相关(在 Android 上测试)。

    【讨论】:

    • Android 是基于 Linux 的。不应期望类似 POSIX/POSIX 的系统将 CR 视为行终止符。
    • 是的,这是真的。我试过使用 10 并且效果很好。还尝试了 13 10 (CRLF),它也工作正常。 CR 不被视为颤振文本小部件中的换行符。所以我想解决方案是,总是在 CR 之后添加 LF 作为我对第一个答案的评论。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2021-06-27
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多