首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从状态Widget中的FormField扩展

从状态Widget中的FormField扩展
EN

Stack Overflow用户
提问于 2022-11-01 14:35:22
回答 1查看 42关注 0票数 0

从状态Widget中的FormField扩展

我有一个带有属性和函数的状态小部件。我想从FormField扩展这个小部件,因为我需要验证这个小部件上的一些用户输入。

似乎不可能从多个类(StatefulWidget和FormField)扩展。

如果我试图创建一个从FormField扩展的普通类:

代码语言:javascript
复制
class CustomInput extends FormField<bool> {
  final Widget label;
  final void Function(bool?) onChanged;

  userClicked() {
    print('User clicked');
  }

  CustomInput({
    required this.label,
    required this.onChanged,
    FormFieldValidator<bool>? validator,
  }) : super(
          validator: validator,
          builder: (field) {           
            return Column(
              children: [
                TextButton(
                  onPressed: () => userClicked(), //<-- The instance member 'userClicked' can't be accessed in an initializer.
                  child: Text('Call internal function'),
                ),

..。然后我无法访问内部方法,因为‘实例成员'userClicked’无法在初始化器中访问。错误。

那么,如何创建一个从FormField扩展到使用validatoronChangedonSaved等的小部件,同时又可以从小部件树访问内部逻辑呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-01 19:48:44

解决方案不是扩展FormField,而是从StatefulWidget返回一个FormField。在本例中,验证内容是字符串数组,但它当然可以是任何内容:

代码语言:javascript
复制
class CustomInput extends StatefulWidget {
  final String? Function(List<String>)? validator;
  final Function(List<String>)? onChanged;

  const CustomInput({this.onChanged, this.validator, Key? key}) : super(key: key);

  @override
  State<CustomInput> createState() => _CustomInputState();
}

class _CustomInputState extends State<CustomInput> {

  @override
  void initState() {
    super.initState();
  }
  
 userClicked() {
    print('User clicked');
  }

  @override
  Widget build(BuildContext context) {
    return FormField(validator: ((value) {
      if (widget.validator != null) {
        return widget.validator!(widget.imagePaths);
      }
      return null;
    }), builder: (FormFieldState<List<String>> state) {
      return Column(
              children: [
                TextButton(
                  onPressed: () => userClicked(), //<-- The instance member 'userClicked' can't be accessed in an initializer.
                  child: Text('Call internal function'),
                ),
                ]
          );
        
    });
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74277545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档