颤振 - 'initialValue == null ||控制器 == null':不是真的

时间:2021-07-08 09:05:11

标签: flutter

我有三个小部件,它们都在与这三个小部件的“主要”不同的文件中,我需要将控制器传递给按钮和 TextFormField,但我不明白如何正确地做到这一点,因此这错误崩溃。我还在“主要”小部件中使用了 ChangeNotifeProvide。

我尝试像这样传递它 controller: user. firstName 并将其放入带有 TextFormField 的小部件中,如下所示 TextEditingController _controller = TextEditingController(text: controller) 但错误是相同的

“主要”小部件:

class _EditDataPageState extends State<EditDataPage> {
  final nameController = TextEditingController();

  @override
  void dispose() {
    nameController.dispose();
    sNameController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<UserState>(
      builder: (context, user, child) => SafeArea(
        top: false,
        left: false,
        right: false,
        bottom: false,
        child: Form(
               key: JosKeys.keyName,
               child: ListView(
               children: <Widget>[
                  Container(
                  //color: Colors.red,
                    child: CustomFormTextField(
                      lengthLimiit: 16,
                      textContoller: nameController,
                      initialName:
                         ${context.select((UserState p) => p.firstName)}',
                         keyboadrd: TextInputType.text),
                      ),

                      SaveButton(
                        key: JosKeys.keyName,
                        typeProperty: 'name',
                        controller: nameController,
                      )
             ],
          ),
        ),
      ),
    );
  }
}

带有 TextFormField 的小部件

class _CustomFormTextFieldState extends State<CustomFormTextField> {
  final String? initialName, typeValidate;
  final TextInputType keyboadrd;
  final TextEditingController textContoller;
  final int lenghtLimit;

  _CustomFormTextFieldState(this.initialName, this.typeValidate, this.keyboadrd,
      this.textContoller, this.lenghtLimit);

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      controller: textContoller,
      inputFormatters: [LengthLimitingTextInputFormatter(lenghtLimit)],
      initialValue: this.initialName,
      keyboardType: keyboadrd,
      validator: _validate,
      style: TextStyle(
          color: Colors.white, fontSize: 14.0, fontWeight: FontWeight.w500),
      decoration: InputDecoration(
        contentPadding: EdgeInsets.all(10.0),
        enabledBorder: OutlineInputBorder(
            borderRadius: BorderRadius.all(Radius.circular(0)),
            borderSide: BorderSide(color: Colors.white54)),
        focusedBorder: OutlineInputBorder(
            borderRadius: BorderRadius.all(Radius.circular(0)),
            borderSide: BorderSide(color: Colors.white54)),
      ),
    );
  }
}

按钮用于保存,我需要那里的控制器来更新数据

class SaveButton extends StatelessWidget {
  //Map<String, String> saveStateForm;
  final GlobalKey<FormState> key;
  final String typeProperty;
  final TextEditingController? controller, secondContoller;

  SaveButton(
      {required this.typeProperty,
      required this.key,
      required this.controller,
      @required this.secondContoller});

  @override
  Widget build(BuildContext context) {
    void onPress() {
      if (this.key.currentState!.validate()) {
        if (this.typeProperty == 'phone') {
          Provider.of<UserState>(context)
              .updatePhone(this.controller.toString());
        } else if (this.typeProperty == 'email') {
          Provider.of<UserState>(context)
              .updateEmail(this.controller.toString());
        } else if (this.typeProperty == 'name' ||
            this.typeProperty == 'sName') {
          Provider.of<UserState>(context)
              .updateFirstName(this.controller.toString());
          if (secondContoller != null) {
            Provider.of<UserState>(context)
                .updateSname(this.controller.toString());
          }
        } else
          print('TYPEPROPERTY ERROR');
      }
    }

1 个答案:

答案 0 :(得分:0)

不能同时使用 initialValue 和控制器。因此,更好的方法是使用控制器,因为它的构造函数确实为您提供了可以设置的初始值。

这是一个例子。

// In class level 
final controller = TextEditingController(text: "Your initial value");

Widget build(BuildContext context) {
  return TextFormField(
    controller: controller, 
    // ...
  );
}

为了跟踪用户输入的值,您可以使用

controller.text