Flutter Error

774 阅读1分钟

异常1

Illegal argument in isolate message : (object is a closure - Function 'XXXX':.)

问题描述

  // flutter使用compute时报异常,使用代码如下
  await compute(fibonacci, 40)

异常原因

compute的第一个参数得是一个顶级方法,不能是类的内部方法, 也不能是静态方法

异常2

Invalid argument(s): string is not well-formed UTF-16

When the exception was thrown, this was the stack: 
#0      ParagraphBuilder.addText (dart:ui/text.dart:3032:7)
#1      TextSpan.build (package:flutter/src/painting/text_span.dart:277:17)
#2      TextPainter._createParagraph (package:flutter/src/painting/text_painter.dart:614:10)
#3      TextPainter.layout (package:flutter/src/painting/text_painter.dart:662:7)
#4      RenderParagraph._layoutText (package:flutter/src/rendering/paragraph.dart:635:18)
#5      RenderParagraph._layoutTextWithConstraints (package:flutter/src/rendering/paragraph.dart:658:5)

对应issue: github.com/flutter/flu…

复现

  • Text中使用🖤\ud83d可以复现
  • Text('😈'.substring(0,1))可以复现 

修复:使用safeSubString替代substring

/// 这个方法的substring支持utf-16, 截取范围超过长度不会抛异常,但会打印一个警告信息
String safeSubstring(int start, [int? end]) {
  List<int> runeList = runes.toList();

  end ??= runeList.length;

  if (end > runeList.length) {
    print(
        'RangeError: end:$end great than string length ${runeList.length}, auto-correct end to ${runeList.length} now, but you should check your code');
    end = runeList.length;
  }

  if (start > runeList.length) {
    print(
        "RangeError: start:$start great than string length ${runeList.length}, auto-correct end to ${runeList.length} now, but you should check your code");
    start = runeList.length;
  }

  return String.fromCharCodes(runeList.sublist(start, end));
}