I tried selecting a DropdownButton item
like this:
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();
final dropdownItem = find.byKey(const ValueKey('First item key'));
await tester.tap(dropdownItem);
await tester.pumpAndSettle();
});
}
But unfortunately, It throws this exception:
There seems to be something that keeps creating an identical DropdownButton item
with the same key, thereby making the widget test fail because, tester.tap()
cannot "tap" on two widgets at the same time.
Here's the full implementation of the DropdownButton
widget:
import 'package:flutter/material.dart';
void main() {
runApp(const SampleApp());
}
class SampleApp extends StatelessWidget {
const SampleApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dropdown Test Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Home(),
);
}
}
class Home extends StatelessWidget {
const Home({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: DummyDropdown(
key: ValueKey('dropdown'),
),
),
);
}
}
class DummyDropdown extends StatefulWidget {
const DummyDropdown({Key? key}) : super(key: key);
@override
State<DummyDropdown> createState() => _DummyDropdownState();
}
class _DummyDropdownState extends State<DummyDropdown> {
String? text = 'Dropdown';
String? textValue;
@override
Widget build(BuildContext context) {
return DropdownButton<String>(
value: textValue,
underline: Container(),
dropdownColor: Theme.of(context).cardColor,
style: Theme.of(context).textTheme.bodyText2,
hint: Text(
text!,
),
icon: const Icon(Icons.keyboard_arrow_down),
onChanged: (newValue) {
setState(
() {
textValue = newValue;
text = newValue;
},
);
},
items: <String>['First item', 'Second item', 'Third item']
.map<DropdownMenuItem<String>>(
(value) {
return DropdownMenuItem<String>(
value: value,
key: ValueKey('$value key'),
child: Text(
value,
),
);
},
).toList(),
);
}
}