【问题标题】:Flutter - how to get Text widget on widget testFlutter - 如何在小部件测试中获取文本小部件
【发布时间】:2019-06-11 15:25:43
【问题描述】:

我正在尝试在 Flutter 中创建一个简单的小部件测试。我有一个自定义小部件,它接收一些值、组成一个字符串并使用该字符串显示一个文本。我必须创建小部件并且它可以工作,但是我无法读取 Text 组件的值来断言生成的文本是正确的。

我创建了一个简单的测试来说明这个问题。我想获取文本值,即“文本”。我尝试了几种方法,如果我得到查找器 asString() 我可以解释字符串来获取值,但我认为这不是一个好的解决方案。我想将组件作为文本读取,以便我可以访问所有属性。

那么,我将如何读取 Text 小部件以便可以访问 data 属性?

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

void main() {
  testWidgets('my first widget test', (WidgetTester tester) async {

    await tester
        .pumpWidget(MaterialApp(home: Text("text", key: Key('unit_text'))));

    // This works and prints: (Text-[<'unit_text'>]("text"))
    var finder = find.byKey(Key("unit_text"));
    print(finder.evaluate().first);

    // This also works and prints: (Text-[<'unit_text'>]("text"))
    var finderByType = find.byType(Text);
    print(finderByType.evaluate().first);

    // This returns empty
    print(finder.first.evaluate().whereType<Text>());

    // This throws: type 'StatelessElement' is not a subtype of type 'Text' in type cast
    print(finder.first.evaluate().cast<Text>().first);

  });
}

【问题讨论】:

    标签: testing flutter


    【解决方案1】:

    我让它工作了。我必须访问元素的小部件属性,然后将其转换为文本:

    var text = finder.evaluate().single.widget as Text;
    print(text.data);
    

    【讨论】:

    • 你可能想要 whereType&lt;Text&gt;() 而不是演员
    • whereType&lt;Text&gt;() 不起作用,因为您迭代的不是Texts,而是StatelessWidgets。您需要访问.widget 属性以获取Text
    • 为了详细说明我最终使用了:final fieldWidget = find.byType(TextField).evaluate().first.widget; final fieldTextValue = (fieldWidget as TextField).controller?.text;
    • 非常有用。谢谢!
    【解决方案2】:

    请检查这个简单的例子。

    testWidgets('Test name', (WidgetTester tester) async {
    
    // findig the widget
    var textFind = find.text("text_of_field");
    
    // checking widget present or not
    expect(textFind, findsOneWidget);
    
    //getting Text object
    Text text = tester.firstWidget(textFind);
    
    // validating properies
    expect(text.style.color, Colors.black);
    ...
    ...
    
    }
    

    【讨论】:

      【解决方案3】:

      你可以使用find.text

      https://flutter.io/docs/cookbook/testing/widget/finders#1-find-a-text-widget

      testWidgets('finds a Text Widget', (WidgetTester tester) async {
        // Build an App with a Text Widget that displays the letter 'H'
        await tester.pumpWidget(MaterialApp(
          home: Scaffold(
            body: Text('H'),
          ),
        ));
      
        // Find a Widget that displays the letter 'H'
        expect(find.text('H'), findsOneWidget);
      });
      

      【讨论】:

      • 我不喜欢这种方法。考虑我的例子:我正在用颤振制作一个简单的游戏,在我的测试中,我正在检查屏幕上是否存在文本 1。我可能在屏幕上有多个 1,但不是我想要的。在这种情况下,测试将通过。我真正想要的是确保 特定元素 的文本符合预期。因此我使用find.byKey(Key('Health')),在生产代码中我写Text(myHealth, key: Key('Health'))
      猜你喜欢
      • 2021-05-09
      • 2019-02-25
      • 2021-03-24
      • 2022-12-12
      • 2019-05-01
      • 2022-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多