flutter - 未处理的异常:customDropDown ValueChanged上的堆栈溢出

标签 flutter dart

我创建了一个自定义下拉列表。

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/

相关文章:

flutter - 如何在Dart中嵌套流(将流映射到流事件)?

Dart 空安全 - 以空安全方式从 map 中检索值

flutter - 'positions.isNotEmpty' : PageController. 在用它构建 PageView 之前无法访问页面。轮播 flutter

Flutter 使用弹性动画折叠和展开小部件

list - flutter - 在 ListView 生成器中滚动 ListView

dart - 将 SliverFillRemaining 与 CustomScrollView 和 SliverList 一起使用

flutter - Flutter:使用MaterialPageRoute从无状态小组件到有状态小组件

dart - Flutter/Dart 类(class)

json - 使用flutter解析具有多个键的json响应

json - Flutter从互联网上获取数据