form.currentstate.validate()失败-颤振

时间:2020-07-22 19:00:29

标签: google-maps flutter dart

我需要一些帮助。我的任务是选择位置以及地址,然后提交。但是出于某些原因,_addPointKey.currentState.validate()始终为false。

我有一个用于获取地址的TextFormField,一个位置预览容器,一个用于打开google_map_location_picker的按钮以及一个最终用于提交数据的按钮。所有这些字段都在带有_addPointKey键的表单中声明。

表单验证确实有效,即,如果字段为空,则以红色显示字段不能为空。但是,仍然存在提交整个formData的问题。 textFormField变为空。

我已经使用google_map_location_picker包来选择位置。有人可以帮忙吗?

谢谢。

final GlobalKey<FormState> _addPointKey = GlobalKey<FormState>();
  Map<String, dynamic> formData = {
    "address": null,
  };

Widget _addressField() {
    return Container(
      margin: EdgeInsets.symmetric(vertical: 10),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text(
            "Address of the Collection Center",
            style: TextStyle(
                fontWeight: FontWeight.bold,
                fontSize: 15,
                color: Theme.of(context).primaryColor),
          ),
          SizedBox(
            height: 10,
          ),
          TextFormField(
            decoration: InputDecoration(
                border: InputBorder.none,
                fillColor: Color(0xfff3f3f4),
                filled: true),
            maxLines: 4,
            validator: (String value) {
              if (value.isEmpty) {
                return "Address is required";
              }
              return '';
            },
            onChanged: (String value) {
              formData["address"] = value;
            },
            onSaved: (String value) {
              formData["address"] = value;
            },
          ),
        ],
      ),
    );
  }

  Widget _locationPreview() {
    return (_pickedLocation != null)
        ? Container(
            height: 300,
            decoration: BoxDecoration(
                border: Border.all(
              width: 2,
              color: Theme.of(context).accentColor,
            )),
            child: GoogleMap(
              initialCameraPosition: CameraPosition(
                target: _pickedLocation.latLng,
                zoom: 14.4746,
              ),
              markers: Set.from(newMarkers),
            ),
          )
        : Container(
            child: Text(
              "Location is required.",
              style: TextStyle(
                color: Colors.red,
              ),
            ),
          );
  }

  Widget _locationButton() {
    return RaisedButton(
      color: Theme.of(context).accentColor,
      onPressed: () async {
        LocationResult result = await showLocationPicker(
          context,
          < API key>,
          initialCenter: LatLng(31.1975844, 29.9598339),
          myLocationButtonEnabled: true,
          layersButtonEnabled: true,
        );
        setState(() {
          _pickedLocation = result;
          _addPointKey.currentState.save();
          newMarkers.add(Marker(
            markerId: MarkerId("newId"),
            draggable: false,
            position: _pickedLocation.latLng,
            onTap: null,
          ));
        });
      },
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Icon(
            Icons.location_on,
            color: Colors.white,
          ),
          Text(
            (_pickedLocation == null) ? 'Locate on Map' : 'Change Location',
            style: TextStyle(color: Colors.white),
          ),
        ],
      ),
    );
  }

  Widget _addLocationButton() {
    return ScopedModelDescendant<MainModel>(
        builder: (BuildContext context, Widget widget, MainModel model) {
      return model.managingCenter
          ? CircularProgressIndicator()
          : InkWell(
              onTap: () async {
                print(_addPointKey.currentState.validate());
                if (!_addPointKey.currentState.validate() ||
                    _pickedLocation == null) {
                  print(formData);
                  return;
                }
                _addPointKey.currentState.save();
                Map<String, dynamic> successInfo =
                    await model.addCenter(model.token, formData);
                if (successInfo["success"]) {
                  Navigator.pop(context);
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => FutureBuilder(
                              future: model.fetchCenter(model.token),
                              builder: (context, authResultSnapShot) {
                                return authResultSnapShot.connectionState ==
                                        ConnectionState.waiting
                                    ? SplashScreen()
                                    : CollectionPoints(model);
                              })));
                } else {
                  print("Something went wrong");
                }
              },
              child: Container(
                height: 50,
                alignment: Alignment.center,
                width: MediaQuery.of(context).size.width,
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.all(Radius.circular(5)),
                  boxShadow: <BoxShadow>[
                    BoxShadow(
                        color: Colors.grey.shade200,
                        offset: Offset(2, 4),
                        blurRadius: 5,
                        spreadRadius: 2)
                  ],
                  gradient: LinearGradient(
                      begin: Alignment.centerLeft,
                      end: Alignment.centerRight,
                      colors: [Color(0xfffbb448), Color(0xfff7892b)]),
                ),
                padding: const EdgeInsets.all(10.0),
                child: Text('Add the Location',
                    style: TextStyle(fontSize: 20, color: Colors.white)),
              ),
            );
    });
  }

  void _addPoint() {
    showBottomSheet(
        context: context,
        builder: (context) {
          return Container(
            padding: EdgeInsets.all(10),
            child: Form(
              key: _addPointKey,
              child: SingleChildScrollView(
                child: Column(
                  children: <Widget>[
                    _addressField(),
                    _locationPreview(),
                    _locationButton(),
                    _addLocationButton()
                  ],
                ),
              ),
            ),
          );
        });
  }

1 个答案:

答案 0 :(得分:1)

在TextFormField验证器函数中,您必须返回null,这表明该字段具有正确的值并且没有错误。返回null以外的任何内容将表明该字段具有无效值,我已经共享了验证函数的更正代码。

          TextFormField(
            decoration: InputDecoration(
                border: InputBorder.none,
                fillColor: Color(0xfff3f3f4),
                filled: true),
            maxLines: 4,
            validator: (String value) {
              if (value.isEmpty) {
                return "Address is required";
              }
             // return ''; this is causing you the error you must return null
                return null; // this is correct 
            },
            onChanged: (String value) {
              formData["address"] = value;
            },
            onSaved: (String value) {
              formData["address"] = value;
            },
          ),