validation - Flutter FormBuilder Dropdown 验证不起作用

标签 validation flutter dart drop-down-menu formbuilder

在这里,我正在为下拉菜单尝试使用 flutter_form_builder。但是当我在单击“下一步”按钮时检查所有字段的验证时出现了一些问题。它将检查表单状态是否有效。如果我单击下一个按钮,它将显示所有必需的文件,它也会显示下拉列表,但 id 我不是下拉列表中的选择值,因此它不需要在不选择下拉值的情况下重定向任何其他页面,因为需要验证.所以问题是下拉验证显示但不起作用。

这是我的屏幕代码:

class _AddWalkinServiceScheduleScreenState
    extends State<AddWalkinServiceScheduleScreen>
    with TickerProviderStateMixin {
  final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
  AddWalkinModel model;
  bool autovalidate = false;
  final TextEditingController _bspBusinessLegalAddress =
      TextEditingController();
  LocationResult _pickedLocation;
  Map<String, dynamic> _typeValue;
  AnimationController controller;
  Animation<double> animation;
  final TextEditingController _serviceDate = TextEditingController();
  TextEditingController _serviceTime = new TextEditingController();
  String _isoDate;
  String addresschoice;
  List<String> _imageFilesList2 = [];
  List<File> _licenseImages2 = [];
  bool _isFlexible = false;
  String _serviceType;
  List<dynamic> _type = <dynamic>[];

  @override
  void initState() {
    super.initState();
  }

  Widget _builddate() {
    return Container(
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(5.0),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(left: 11),
            child: Text(
              "Date",
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
          ),
          _buildservicedate(),
        ],
      ),
    );
  }


  Widget _buildselectAddress() {
    return Container(
      padding: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(5.0),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(left: 11),
            child: Text(
              "Select Address",
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
          ),
          _buildaddresschoice(),
          addresschoice == "Current Location"
              ? _addressTextfield()
              : (addresschoice == "Select from address book" ||
                      model.address != null)
                  ? _addressTextfield()
                  : SizedBox(),
          _buildServicetype()
        ],
      ),
    );
  }

  Widget _addressTextfield() {
    return TudoTextWidget(
      prefixIcon: Icon(FontAwesomeIcons.mapMarkedAlt),
      labelText: "Address",
      hintText: "Address",
      controller: _bspBusinessLegalAddress,
      validator: (val) =>
          Validators.validateRequired(val, "Address"),
    );
  }

  Widget _buildServicetype() {
    return FormBuilder(
      autovalidate: autovalidate,
      child: FormBuilderCustomField(
          attribute: "Select Address",
          validators: [FormBuilderValidators.required()],
          formField: FormField(
            builder: (FormFieldState<dynamic> field) {
              return InputDecorator(
                decoration: InputDecoration(
                  prefixIcon: Icon(Icons.business_center),
                  errorText: field.errorText,
                ),
                isEmpty: _typeValue == [],
                child: new DropdownButtonHideUnderline(
                  child: DropdownButton(
                    hint: Text("Service Type"),
                    isExpanded: true,
                    items: [
                      "Normal",
                      "Urgent",
                      "Emergency",
                    ].map((option) {
                      return DropdownMenuItem(
                        child: Text("$option"),
                        value: option,
                      );
                    }).toList(),
                    value: field.value,
                    onChanged: (value) {
                      field.didChange(value);
                      _serviceType = value;
                    },
                  ),
                ),
              );
            },
          )),
    );
  }



  Widget content(BuildContext context, AddWalkinServiceDetailViewModel awsdVm) {
    var colorStyles = Theming.colorstyle(context);
    Orientation orientation = MediaQuery.of(context).orientation;
    return Scaffold(
      backgroundColor: colorStyles['primary'],
      appBar: AppBar(
        elevation: 0,
        title: Text("Service Details"),
        centerTitle: true,
      ),
    bottomNavigationBar: Container(
        color: Colors.white,
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            new FlatButton.icon(
              icon: Icon(FontAwesomeIcons.arrowCircleRight),
              padding: EdgeInsets.symmetric(vertical: 10, horizontal: 30),
              label: Text('Search'),
              color: colorStyles["primary"],
              textColor: Colors.black,
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(7),
              ),
              onPressed: () {
                setState(() {
                  autovalidate = true;
                });
                if (_formkey.currentState.validate()) {
                  List<ServicePicture> id1Images = [];
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => ServiceProviderMapScreen(
                          addWalkinModel: model,
                        ),
                      ),
                    );
                  }
                }
            ),
          ],
        ),
      ),
      body: FadeTransition(
        opacity: animation,
        child: Container(
          child: Form(
            autovalidate: autovalidate,
            key: _formkey,
            child: Stack(
              children: <Widget>[
                SingleChildScrollView(
                  padding: EdgeInsets.all(16.0),
                  child: Container(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        _builddate(),
                        _buildflexible(),

                      ],
                    ),
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return new StoreConnector<AppState, AddWalkinServiceDetailViewModel>(
      converter: (Store<AppState> store) =>
          AddWalkinServiceDetailViewModel.fromStore(store),
      builder: (BuildContext context, AddWalkinServiceDetailViewModel awsdVm) =>
          content(context, awsdVm),
    );
  }
}

最佳答案

你应该使用 FormBuilderDropdown反而。这包含在 flutter_form_builder 中.

DropdownButtonHideUnderline(
  child: FormBuilderDropdown(
    name: 'dropdown'
    hint: Text("Service Type"),
    isExpanded: true,
    items: [
      "Normal",
      "Urgent",
      "Emergency",
    ].map((option) {
      return DropdownMenuItem(
        child: Text("$option"),
        value: option,
      );
    }).toList(),,
  ),
),

使用它,可以通过从 map 中调用它来提取下拉值 GlobalKey<FormState>.currentState.value使用 name早先设置为 key 。

_formKey.currentState.value['dropdown']

关于validation - Flutter FormBuilder Dropdown 验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59998635/

相关文章:

validation - 查询 : not a URL code point 中的非法字符

flutter - 处理异常 HTTP 请求抖动

flutter - 如何使用 FlutterDriver 关闭对话框

dart - Flutter:在单元测试中获取 PopupMenuButton 的 PopupMenuItem 文本

flutter - 使用具有意图和发布参数的Flutter Launch默认浏览器

java - 如何实现用户验证以仅接受少数字母有效

在 Respect/Validation 中使用自定义规则时,PHPStan 抛出未定义的静态方法

flutter : Change size of stack when children overflow

javascript - 在 Flutter 中构建 d3.js 小部件

php - 仅正整数的正则表达式是什么? (零是不允许的)