[英]Flutter DropDownButton won't display selected value even when I update it
所以我創建了我自己的使用 DropDownButton class 的小部件,它曾經工作,它會以一種方式更新,在你 select 一個值之后,它會顯示選定的值。 我重構了我的代碼以涉及整個模型視圖/視圖模型技術,現在在你 select 列表中的一個值之后,它仍然只在你單擊它后顯示列表的默認第一個值。
這是我的 DropDownWidget class 的代碼:
class DropDownWidget extends StatefulWidget {
//const DropDownWidget({Key? key}) : super(key: key);
List<String> dropdownOptions = [];
String? dropdownValue;
DropDownWidget(List<String> options) {
dropdownOptions = options;
dropdownValue = dropdownOptions.isNotEmpty ? dropdownOptions[0] : null;
}
@override
State<DropDownWidget> createState() => _DropDownWidgetState();
}
class _DropDownWidgetState extends State<DropDownWidget>
with TickerProviderStateMixin {
late AnimationController controller;
@override
void initState() {
controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 1),
)..addListener(() {
setState(() {});
});
controller.repeat(reverse: true);
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
var dropdownOptions = widget.dropdownOptions;
var dropdownValue = widget.dropdownValue;
if (dropdownOptions.isEmpty) {
return LinearProgressIndicator(
value: controller.value, //0.75,
color: const Color(0xFFFFA663),
backgroundColor: const Color(0x3498DBA5),
);
}
return DropdownButton<String>(
value: dropdownValue, //?? dropdownOptions[0],
icon: const Icon(
Icons.agriculture_rounded,
color: Color(0xFF773608), //Color(0xFF2E7D32), //Colors.green,
),
elevation: 16,
underline: Container(
height: 2,
color: vo.shade200,
),
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
print(newValue);
});
},
items: dropdownOptions.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
);
}
}
讓我知道是否需要更多代碼。
因此,從我看到的代碼中,您正在構建方法中初始化變量,而您必須在 initState 中進行初始化。
為什么該項目沒有得到改變:
該項目正在更改,但 setstate 方法會將其重新分配給列表中的第一項。
因為 setstate 將重建構建方法,並且您確實在構建方法中分配了項目。 這就是它沒有改變的原因。
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(
home: MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
child: DropDownWidget(['one', 'two']),
),
);
}
}
class DropDownWidget extends StatefulWidget {
//const DropDownWidget({Key? key}) : super(key: key);
List<String> dropdownOptions = [];
String? dropdownValue;
DropDownWidget(List<String> options) {
dropdownOptions = options;
dropdownValue = dropdownOptions.isNotEmpty ? dropdownOptions[0] : null;
}
@override
State<DropDownWidget> createState() => _DropDownWidgetState();
}
class _DropDownWidgetState extends State<DropDownWidget>
with TickerProviderStateMixin {
late AnimationController controller;
late List<String> dropdownOptions;
late String? dropdownValue;
@override
void initState() {
dropdownOptions = widget.dropdownOptions;
dropdownValue = widget.dropdownValue;
controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 1),
)..addListener(() {
setState(() {});
});
controller.repeat(reverse: true);
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (dropdownOptions.isEmpty) {
return LinearProgressIndicator(
value: controller.value, //0.75,
color: const Color(0xFFFFA663),
backgroundColor: const Color(0x3498DBA5),
);
}
return DropdownButton<String>(
value: dropdownValue, //?? dropdownOptions[0],
icon: const Icon(
Icons.agriculture_rounded,
color: Color(0xFF773608), //Color(0xFF2E7D32), //Colors.green,
),
elevation: 16,
underline: Container(
height: 2,
color: Colors.black,
),
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
print(newValue);
});
},
items: dropdownOptions.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.