Замените Future.then () на async / await

Я нашел некоторые методы, которые отлично работают ...

/// <summary>
/// Get the required height and width of the specified text. Uses Glyph's
/// </summary>
public static Size MeasureText(string text, FontFamily fontFamily, FontStyle fontStyle, FontWeight fontWeight, FontStretch fontStretch, double fontSize)
{
    Typeface typeface = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch);
    GlyphTypeface glyphTypeface;

    if (!typeface.TryGetGlyphTypeface(out glyphTypeface))
    {
        return MeasureTextSize(text, fontFamily, fontStyle, fontWeight, fontStretch, fontSize);
    }

    double totalWidth = 0;
    double height = 0;

    for (int n = 0; n < text.Length; n++)
    {
        ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]];

        double width = glyphTypeface.AdvanceWidths[glyphIndex] * fontSize;

        double glyphHeight = glyphTypeface.AdvanceHeights[glyphIndex] * fontSize;

        if (glyphHeight > height)
        {
            height = glyphHeight;
        }

        totalWidth += width;
    }

    return new Size(totalWidth, height);
}

/// <summary>
/// Get the required height and width of the specified text. Uses FortammedText
/// </summary>
public static Size MeasureTextSize(string text, FontFamily fontFamily, FontStyle fontStyle, FontWeight fontWeight, FontStretch fontStretch, double fontSize)
{
    FormattedText ft = new FormattedText(text,
                                            CultureInfo.CurrentCulture,
                                            FlowDirection.LeftToRight,
                                            new Typeface(fontFamily, fontStyle, fontWeight, fontStretch),
                                            fontSize,
                                            Brushes.Black);
    return new Size(ft.Width, ft.Height);
}
1
задан deekay42 18 January 2019 в 04:08
поделиться

1 ответ

1: Как я могу использовать здесь async / await вместо Future.then ()? Какое самое элегантное решение?

асинхронные методы заразительны. Это означает, что ваш метод ItemsRepository должен быть асинхронным, чтобы использовать await внутри. Это также означает, что вы должны вызывать его асинхронно из других мест. Смотрите пример:

Future<dynamic> ItemsRepository() async {
    // #1
    myString = await rootBundle.loadString('assets/data/item_int2string.json');
    // do something with my string here, which is not in a Future anymore...
  }

Обратите внимание, что использование .then - это то же самое, что и ожидание в асинхронной функции. Это просто синтаксический сахар. Обратите внимание, что вы будете использовать .then иначе, чем в вашем примере:

  ItemsRepository() {
    // #1

     rootBundle.loadString('assets/data/item_int2string.json').then((String myString) {
       // do something with myString here, which is not in a Future anymore...
     });
  }

И для # 2 не беспокойтесь о влиянии асинхронного кода на производительность. Код будет выполняться с той же скоростью, что и синхронный код, чуть позже, когда произойдет обратный вызов. Единственная причина, по которой существует асинхронность, заключается в простом способе продолжения работы кода, пока система ожидает возврата асинхронно вызываемой части. Например, не блокируйте пользовательский интерфейс, ожидая, пока диск загрузит файл.

Я рекомендую вам прочитать основные документы об асинхронности в Dart .

0
ответ дан Oswin Noetzelmann 18 January 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: