Flutter组件测试中如何选中DropdownButton选项并解决同键报错
问题成因
DropdownButton组件在渲染时,会生成两份完全相同的DropdownMenuItem实例:
- 一份用于未打开下拉框时,作为选中结果展示在DropdownButton的按钮区域
- 另一份会在你点击打开下拉菜单后,渲染在弹出的浮层列表中
你给每个DropdownMenuItem绑定了固定Key,所以这两份实例会持有相同的Key,导致测试时find.byKey会同时匹配到两个组件,触发tap方法时就会抛出多组件匹配的异常。
解决方案
你只需要在查找下拉项时,指定匹配浮层内的最后一个实例即可,修改后的测试代码如下:
import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:dropdown_test_sample/main.dart'; void main() { testWidgets('Select Dropdown item test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(const SampleApp()); final dropdown = find.byKey(const ValueKey('dropdown')); await tester.tap(dropdown); await tester.pumpAndSettle(); // 取最后一个匹配的Key实例,对应弹出浮层内的可点击选项 final dropdownItem = find.byKey(const ValueKey('First item key')).last; await tester.tap(dropdownItem); await tester.pumpAndSettle(); // 可选:验证选中结果是否符合预期 expect(find.text('First item'), findsOneWidget); }); }
如果你不想用Key查找,也可以通过文本内容匹配下拉选项,写法如下:
final dropdownItem = find.text('First item').last;
内容的提问来源于stack exchange,提问作者Joshua Erinosho
相关产品推荐
相关产品推荐

