Flutter DropdownButtonFormField не обновляет переменную - PullRequest
0 голосов
/ 03 мая 2020

Так что я борюсь с DropdownButtonFormField, где при изменении значения он запускает функцию onChange с обновленным значением, однако, как только onChange завершает, переменная значения, кажется, сбрасывает себя, означая, что она никогда не меняется.

Это урезанный вариант полной формы:

  final _formKey = GlobalKey<FormState>();
  TextEditingController assetGroupNameController = new TextEditingController();
  TextEditingController assetGroupDescriptionController = new TextEditingController();
  String assetGroupTypeController;

 Widget build(BuildContext context) {
    ProgressDialog pr;

    assetGroupNameController.text = widget.assetGroup.name;
    assetGroupDescriptionController.text = widget.assetGroup.description;
    assetGroupTypeController = widget.assetGroup.type;

   return ListView(
      children: <Widget>[
        Card(
          elevation: 13.0,
          child: Form(
          key: _formKey,
          child: DropdownButtonFormField(
            value: assetGroupTypeController,
            items: assetGroupTypes.map((f) {
              return new DropdownMenuItem<String>(
                value: f['key'],
                child: new Text(f['text']),
              );
            }).toList(),
            onChanged: (value) {
              typeDropdownChange(value);
            })
          )
        )
   );

 }
  void typeDropdownChange(value) {
    setState(() {
      assetGroupTypeController = value;
    });
  }

1 Ответ

0 голосов
/ 03 мая 2020

Вы назначили контроллер непосредственно на value параметр DropdownButtonFormField, и у вас есть строковое значение для DropdownMenuItem. Вы должны хранить то же значение типа данных. Проверьте пример ниже и измените свой код соответственно

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Material(
        child: Center(
          child: new MyDropDown(),
        ),
      ),
    );
  }
}

class MyDropDown extends StatefulWidget {
  const MyDropDown({
    Key key,
  }) : super(key: key);

  @override
  _MyDropDownState createState() => _MyDropDownState();
}

class _MyDropDownState extends State<MyDropDown> {
  String selected;
  @override
  Widget build(BuildContext context) {
    return DropdownButtonFormField<String>(
      value: selected,
      items: ["Item 1", "Item 2", "Item 3"]
          .map((label) => DropdownMenuItem<String>(
        child: Text(label),
        value: label,
      ))
          .toList(),
      onChanged: (value) {
        setState(() => selected = value);
      },
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...