我是Flutter的新手,正尝试使用Dynamic FormField构建应用程序,问题是dropdownformfield值未随索引更新。但是,使用textformfield可以使用,但不能与Dropdownformfield一起使用
flutter - Flutter动态DropdownFormField值未使用索引更新-LMLPHP
flutter - Flutter动态DropdownFormField值未使用索引更新-LMLPHP
当您按+按钮时,会出现一个新行,但是如果您查看dropdownformfield,则该值将变为空白,并且不会随该行更新。
这是代码。

class DynamicWidgets extends StatefulWidget {
  @override
  _DynamicWidgetState createState() => _DynamicWidgetState();

  }


class _DynamicWidgetState extends State<DynamicWidgets> {
  final _formKey = GlobalKey<FormState>();
  TextEditingController _nameController;
  static List<String> dropdowndata=[null];
  static List<String> descriotiondata=[null];

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _nameController = TextEditingController();
    _nameController.text = "XR";
  }

  @override
  void dispose() {
    _nameController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Form(
      key: _formKey,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Padding(
              padding: const EdgeInsets.only(right: 32.0),
              child: TextFormField(
                controller: _nameController,
                decoration: InputDecoration(hintText: 'Modality Name'),
                validator: (v) {
                  if (v.trim().isEmpty) return 'Please enter something';
                  return null;
                },
              ),
            ),
            Text("Add More Study"),
            SizedBox(
              height: 5,
            ),
            ..._getFields(),
            SizedBox(
              height: 10,
            ),
            FlatButton(
              onPressed: () {
                if (_formKey.currentState.validate()) {
                  _formKey.currentState.save();
                  debugPrint("Widget1 Key data: ${dropdowndata.toString()}");
                  debugPrint("Widget2 Key data: ${descriotiondata.toString()}");
                }
              },
              child: Text(
                'Submit',
                style: TextStyle(color: Colors.white),
              ),
              color: Colors.green,
            ),
          ],
        ),
      ),
    );
    throw UnimplementedError();
  }

  List<Widget> _getFields() {
    List<Widget> friendsTextFields = [];
    for (int i = 0; i < dropdowndata.length; i++) {
      friendsTextFields.add(Padding(
        padding: const EdgeInsets.symmetric(vertical: 16.0),
        child: Row(
          children: [
            Expanded(child: DynamicFields(i)),
            SizedBox(
              width: 16,
            ),
            // we need add button at last friends row
            _addRemoveButton(i == dropdowndata.length - 1, i),
          ],
        ),
      ));
    }
    return friendsTextFields;
  }

  Widget _addRemoveButton(bool add, int index) {
    return InkWell(
      onTap: () {
        if (add) {
          // add new text-fields at the top of all friends textfields
          dropdowndata.insert(0, null);
          descriotiondata.insert(0, null);
        } else {
          dropdowndata.removeAt(index);
          descriotiondata.removeAt(index);
        }
        setState(() {});
      },
      child: Container(
        width: 30,
        height: 30,
        decoration: BoxDecoration(
          color: (add) ? Colors.green : Colors.red,
          borderRadius: BorderRadius.circular(20),
        ),
        child: Icon(
          (add) ? Icons.add : Icons.remove,
          color: Colors.white,
        ),
      ),
    );
  }
}


class DynamicFields extends StatefulWidget {
  final int index;
  DynamicFields(this.index);
  @override
  _DynamicFieldsState createState() => _DynamicFieldsState();
}

class _DynamicFieldsState extends State<DynamicFields>{
  TextEditingController _descriptionController;
    var _selectedValue;
    var _dropdownvalue;
  String _myActivity;
  String _myActivityResult;
  static var _studynames = ["CT-62", "CT-53","CT-54","CT-50"];
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    this._descriptionController=TextEditingController();

  }
  @override
  void dispose() {
    _descriptionController.dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      _descriptionController.text = _DynamicWidgetState.descriotiondata[widget.index] ?? '';
      _selectedValue=_DynamicWidgetState.dropdowndata[widget.index] ?? '';
    });
    // TODO: implement build
    return Row(
      children: [
        Flexible(
          flex: 1,
          child: Container(
            margin: EdgeInsets.all(5.0),
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(5.0),
              border: Border.all(
                  color: Colors.blueGrey, style: BorderStyle.solid, width: 0.80),
            ),
            child: Padding(
              padding: EdgeInsets.all(2.0),
              child: Material(
                shape:
                RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
                elevation: 0.0,
                child: ListTile(
                  title: DropdownButton(
                    items: _studynames.map((String dropdownitem) {
                      return DropdownMenuItem<String>(
                        value: dropdownitem,
                        child: Text(
                          dropdownitem,
                          style: TextStyle(color: Color(0xFF4BC1FF)),
                        ),
                      );
                    }).toList(),
                    underline: Container(
                      height: 0,
                    ),
                    value: _dropdownvalue,
                    onChanged: (valueSelected) {
                      setState(() {
                        debugPrint("$valueSelected value selected");
                        _dropdownvalue = valueSelected;
                        _DynamicWidgetState.dropdowndata[widget.index] = valueSelected;

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

        SizedBox(width: 10),
        Flexible(
          flex: 1,
          child:  TextFormField(
            controller: _descriptionController,
            onChanged: (v) => _DynamicWidgetState.descriotiondata[widget.index] = v,
            decoration: InputDecoration(
                hintText: 'Study Description'
            ),
            validator: (v){
              if(v.trim().isEmpty) return 'Please enter Study Description';
              return null;
            },
          ),
        )
      ],
    );
    throw UnimplementedError();
  }

}

最佳答案

在“_DynamicFieldsState”下的字段中获取“下拉列表”值时,您没有使用创建的列表数据。因此,您的应用程序不知道它将在这些 Realm 中获得的值(value)。查看我是否刚刚更改了“_DynamicFieldsState”字段中的某些值。

import 'package:flutter/material.dart';

class DynamicWidgets extends StatefulWidget {
  @override
  _DynamicWidgetState createState() => _DynamicWidgetState();

}


class _DynamicWidgetState extends State<DynamicWidgets> {
  final _formKey = GlobalKey<FormState>();
  TextEditingController _nameController;
  static List<String> dropdowndata=[null];
  static List<String> descriotiondata=[null];

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _nameController = TextEditingController();
    _nameController.text = "XR";
  }

  @override
  void dispose() {
    _nameController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      resizeToAvoidBottomPadding: false,

      body: Form(
        key: _formKey,
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Padding(
                padding: const EdgeInsets.only(right: 32.0),
                child: TextFormField(
                  controller: _nameController,
                  decoration: InputDecoration(hintText: 'Modality Name'),
                  validator: (v) {
                    if (v.trim().isEmpty) return 'Please enter something';
                    return null;
                  },
                ),
              ),
              Text("Add More Study"),
              SizedBox(
                height: 5,
              ),
              ..._getFields(),
              SizedBox(
                height: 10,
              ),
              FlatButton(
                onPressed: () {
                  if (_formKey.currentState.validate()) {
                    _formKey.currentState.save();
                    debugPrint("Widget1 Key data: ${dropdowndata.toString()}");
                    debugPrint("Widget2 Key data: ${descriotiondata.toString()}");
                  }
                },
                child: Text(
                  'Submit',
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.green,
              ),
            ],
          ),
        ),
      ),
    );
    throw UnimplementedError();
  }

  List<Widget> _getFields() {
    List<Widget> friendsTextFields = [];
    for (int i = 0; i < dropdowndata.length; i++) {
      friendsTextFields.add(Padding(
        padding: const EdgeInsets.symmetric(vertical: 16.0),
        child: Row(
          children: [
            Expanded(child: DynamicFields(i)),
            SizedBox(
              width: 16,
            ),
            // we need add button at last friends row
            _addRemoveButton(true, i),
          ],
        ),
      ));
    }
    return friendsTextFields;
  }

  Widget _addRemoveButton(bool add, int index) {
    print('index:' + index.toString());
    return InkWell(
      onTap: () {
        if (add) {
          // add new text-fields at the top of all friends textfields
          dropdowndata.insert(0, null);
          descriotiondata.insert(0, null);
        } else {
          dropdowndata.removeAt(index);
          descriotiondata.removeAt(index);
        }
        setState(() {});
      },
      child: Container(
        width: 30,
        height: 30,
        decoration: BoxDecoration(
          color: (add) ? Colors.green : Colors.red,
          borderRadius: BorderRadius.circular(20),
        ),
        child: Icon(
          (add) ? Icons.add : Icons.remove,
          color: Colors.white,
        ),
      ),
    );
  }
}


class DynamicFields extends StatefulWidget {
  final int index;
  DynamicFields(this.index);
  @override
  _DynamicFieldsState createState() => _DynamicFieldsState();
}

class _DynamicFieldsState extends State<DynamicFields>{
  TextEditingController _descriptionController;
  var _selectedValue;
  var _dropdownvalue;
  String _myActivity;
  String _myActivityResult;
  static var _studynames = ["CT-62", "CT-53","CT-54","CT-50"];
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    this._descriptionController=TextEditingController();

  }
  @override
  void dispose() {
    _descriptionController.dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      _descriptionController.text = _DynamicWidgetState.descriotiondata[widget.index] ?? '';
      _selectedValue=_DynamicWidgetState.dropdowndata[widget.index] ?? '';
    });
    // TODO: implement build
    return Row(
      children: [
        Flexible(
            flex: 1,
            child: Container(
              margin: EdgeInsets.all(5.0),
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(5.0),
                border: Border.all(
                    color: Colors.blueGrey, style: BorderStyle.solid, width: 0.80),
              ),
              child: Padding(
                padding: EdgeInsets.all(2.0),
                child: Material(
                  shape:
                  RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
                  elevation: 0.0,
                  child: ListTile(
                    title: DropdownButton(
                      items: _studynames.map((String dropdownitem) {
                        return DropdownMenuItem<String>(
                          value: dropdownitem,
                          child: Text(
                            dropdownitem,
                            style: TextStyle(color: Color(0xFF4BC1FF)),
                          ),
                        );
                      }).toList(),
                      underline: Container(
                        height: 0,
                      ),
                      value: _DynamicWidgetState.dropdowndata[widget.index], // Here
                      onChanged: (valueSelected) {
                        setState(() {
                          debugPrint("$valueSelected value selected");
                          _dropdownvalue = _DynamicWidgetState.dropdowndata[widget.index]; // Here
                          _DynamicWidgetState.dropdowndata[widget.index] = valueSelected;

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

        SizedBox(width: 10),
        Flexible(
          flex: 1,
          child:  TextFormField(
            controller: _descriptionController,
            onChanged: (v) => _DynamicWidgetState.descriotiondata[widget.index] = v,
            decoration: InputDecoration(
                hintText: 'Study Description'
            ),
            validator: (v){
              if(v.trim().isEmpty) return 'Please enter Study Description';
              return null;
            },
          ),
        )
      ],
    );
    throw UnimplementedError();
  }

}

关于flutter - Flutter动态DropdownFormField值未使用索引更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64460254/

10-11 22:20
查看更多