Sou novato no Flutter, alguém pode me ajudar? Quando escolho o primeiro menu suspenso, escolho o segundo menu suspenso e depois escolho novamente o primeiro menu suspenso, recebo um erro de congelamento, já defini a lista de variáveis como vazia, mas ainda não está funcionando, recebo o erro:
deve haver exatamente um item com o valor do dropdownbutton zero ou 2 ou mais [DropdownMenuItem]s foram detectados com o mesmo valor
este é meu código:
principal.dardo
import 'package:flutter/material.dart';
import 'package:perhitungan_pkt_kgb/data.dart';
class HitungPkt extends StatefulWidget {
const HitungPkt({super.key});
@override
State<HitungPkt> createState() => _HitungPktState();
}
class _HitungPktState extends State<HitungPkt> {
@override
Widget build(BuildContext context) {
return Form(
child: Column(
children: [
_buildDropdown(
label: 'Gol',
items: Data.gol.cast<Map<String, dynamic>>(),
onChanged: (String? newValue) {
setState(() {
// value dropdown nya kita masukan ke sebuah variabel
Data.golValue = newValue;
Data.vehicle?.clear();
Data.vehicle = Data.cekgol();
});
}),
if (Data.vehicle != null)
_buildDropdown(
label: 'Vechile',
items: Data.vehicle!.cast<Map<String, dynamic>>(),
onChanged: (String? newValue) {
setState(() {
// value dropdown nya kita masukan ke sebuah variabel
Data.vehicleValue = newValue;
});
}),
],
),
);
}
Widget _buildDropdown({
required String label,
required List<Map<String, dynamic>> items,
required void Function(String?) onChanged,
String? value,
}) {
return DropdownButtonFormField<String>(
decoration: InputDecoration(
labelText: label,
hintStyle: const TextStyle(color: Colors.blue),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.blue),
),
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.blue),
borderRadius: BorderRadius.circular(10),
),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.blue),
borderRadius: BorderRadius.circular(10),
),
errorBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.blue),
borderRadius: BorderRadius.circular(10),
),
),
value: value,
items: items.map((item) {
return DropdownMenuItem<String>(
value: item['value'] as String,
child: Text(item['label'] as String),
);
}).toList(),
onChanged: onChanged);
}
}
dados.dardo
class Data{
static const List gol = [
{'value': 'Car', 'label': 'Car'},
{'value': 'Bus', 'label': 'Bus'},
{'value': 'Plane', 'label': 'Plane'}
];
static String? golValue;
static String? vehicleValue;
static List? vehicle;
static List cekgol() {
if (golValue == 'Car') {
return [
{'value': 'car1', 'label': 'car1'},
{'value': 'car2', 'label': 'car2'},
{'value': 'car3', 'label': 'car3'},
{'value': 'car4', 'label': 'car4'},
{'value': 'car5', 'label': 'car5'}
];
} else if (golValue == 'Bus') {
return [
{'value': 'Bus1', 'label': 'Bus1'},
{'value': 'Bus2', 'label': 'Bus2'},
{'value': 'Bus3', 'label': 'Bus3'},
{'value': 'Bus4', 'label': 'Bus4'}
];
} else if (golValue == 'Plane') {
return [
{'value': 'Plane1', 'label': 'Plane1'},
{'value': 'Plane2', 'label': 'Plane2'},
{'value': 'Plane3', 'label': 'Plane3'},
{'value': 'Plane4', 'label': 'Plane4'},
{'value': 'Plane5', 'label': 'Plane5'}
];
} else {
return [];
}
}
}
O problema surge porque você provavelmente está definindo o valor do seu DropdownButtonFormField para um valor que não está presente na lista de itens que você fornece. Quando você altera o primeiro menu suspenso (Gol), você limpa corretamente a lista de veículos, mas não está redefinindo o vehicleValue. Isso significa que o segundo menu suspenso tenta renderizar com um vehicleValue que não existe mais na lista de veículos recém-preenchida, causando o erro.