我创建了一个自定义下拉列表。
class CustomDropDown extends StatefulWidget{
String selectValue,hintText;
List<String> valueList;
final double width;
final double height;
final Color textColor;
final FontWeight fontWeight;
final ValueChanged<String> onChanged;
CustomDropDown({Key key,this.fontWeight,this.height = 40.0,this.hintText,this.onChanged, this.textColor, this.selectValue, this.valueList,this.width}) : super(key: key);
@override
_CustomDropDownState createState() => _CustomDropDownState();
}
class _CustomDropDownState extends State<CustomDropDown> {
@override
Widget build(BuildContext context) {
return Container(
height: widget.height,
width: widget.width,
decoration: BoxDecoration(
color: Palette.white,
borderRadius: BorderRadius.all(Radius.circular(5)),
border: Border.all(width: 1, color: Palette.darkSilver),
),
child: Padding(
padding: const EdgeInsets.only(left: 8.0),
child: DropdownButton<String>(
isExpanded: true,
value: widget.selectValue,
onChanged:widget.onChanged,
items: widget.valueList.map((String value) {
return DropdownMenuItem<String>(
value: value,
child: CustomText(
text: value,
textColor: widget.textColor,
fontWeight: widget.fontWeight),
);
}).toList(),
),
),
);
}
}
从各处调用,这是内部构建方法
CustomDropDown(
selectValue: selectGender,
valueList: genderList,
width: width,
textColor: Palette.darkOrange,
fontWeight: FontWeight.bold,
onChanged:onChangedGender
),
外部构建方法
ValueChanged<String> onChangedGender(String value){
setState(() {
selectGender = value;
});
return onChangedGender(value);
}
控制台错误,为什么会这样?
Unhandled Exception: Stack Overflow
E/flutter (14614): #0 Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:3872:12)
E/flutter (14614): #1 Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:3911:6)
E/flutter (14614): #2 State.setState (package:flutter/src/widgets/framework.dart:1168:14)
E/flutter (14614): #3 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:187:8)
E/flutter (14614): #4 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #5 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #6 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #7 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #8 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #9 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #10 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #11 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #12 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #13 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #14 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #15 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #16 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #17 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #18 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #19 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #20 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #21 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #22 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #23 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #24 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #25 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #26 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #27 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #28 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #29 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #30 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #31 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #32 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #33 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #34 _AccountInfoPageState.onChanged (package:accountInfo/accountInfoPage.dart:190:20)
E/flutter (14614): #35 _AccountInfoPageState.onCha
最佳答案
您在onChangeGender()
内进行了一次递归调用,因为它没有任何方法可以停止递归调用,它将继续调用并填充堆栈,直到堆栈溢出为止。ValueChanged<T>
只是一个函数的定义,该函数接受一个值,但不返回任何内容:
typedef ValueChanged<T> = void Function(T value);
因此,您只需要传递一个兼容的函数,例如:
void onChangeGender(String value) {
...
}
不需要返回值,该返回值将始终被
ValueChanged<T>
定义忽略。您可以通过以下方法使它更简单:
onChanged: (value) => setState(() => selectGender = value),
幸运的是,在Stackoverflow上询问Stack Overflows不是递归的,应该很安全:)
关于flutter - 未处理的异常:customDropDown ValueChanged上的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61981941/