我正在try 在Ffltter中创建一个简单的小部件测试.我有一个自定义小部件,它接收一些值,组成一个字符串,并显示包含该字符串的文本.我必须创建小部件,并且它可以工作,但是我在读取文本组件的值以断言生成的文本是正确的时遇到了问题.

我创建了一个简单的测试来说明这个问题.我想得到文本值,也就是"text".我try 了几种方法,如果得到取景器ASSTRing(),我可以解释字符串来获得值,但我不认为这是一个好的解决方案.我想以文本的形式读取组件,以便访问所有属性.

那么,如何读取文本小部件以便访问数据属性呢?

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);

  });
}

推荐答案

我成功了.我必须访问元素的widget属性,然后将其转换为文本:

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

Flutter相关问答推荐

我如何才能收到每天重复的预定通知?

在Riverpod ConsumerWidget中使用文本编辑控制器

如何在用Ffltter成功登录后重定向下一页?

从超级应用程序启动时,Flutter 小应用程序中未加载资源

在选项卡栏视图中搜索和筛选不起作用

如何创建这样的按钮

怎么才能像这样在摆动着这些曲线呢?

未处理的异常:第1行第5列出现错误:无效的媒体类型:应为/&;.从API获取数据时在Flutter中

如何将 Flutter 项目迁移到具有多个插件的 Gradle 8?

参数类型void Function()无法分配给参数类型void Function(LongPressEndDetails)?

Android 模拟器在 Apple M2 芯片 EXC_BAD_ACCESS / KERN_INVALID_ADDRESS 上随机崩溃

使用 riverpod 提供 GoRouter 实例的正确方法是什么?

setState 方法有时有效,有时无效

如何(部分)更新 riverpod 中的 AsyncValue?

如何使用 riverpod_annotation 创建非自动处置提供程序?

应用程序包含嵌入式私钥或密钥库文件

使用 onPressed 切换到另一个屏幕无法正常工作

Flutter 中的 Firebase 后台消息处理程序产生重复的隔离并运行应用程序两次

使用 mocktail 包进行单元测试时,类型Null不是Future类型的子类型

如何从用户 Flutter 导航抽屉中隐藏管理菜单