Программно изменить значение DropdownButtonFormField - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь изменить значение DropdownButtonFormField при событии (например, при нажатии кнопки) с помощью setState. Но он не работает.

Примечание: он работает, если я использую DropdownButton, но с DropdownButtonFormField он не отвечает.

Вот простой код, показывающий, что я пытаюсь реализовать.

import 'package:flutter/material.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
 @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Testing(),
    );
  }
}

class Testing extends StatefulWidget {
  @override
  _TestingState createState() => _TestingState();
}

class _TestingState extends State<Testing> {
  String selectedValue;
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Column(
        children: <Widget>[
          DropdownButtonFormField(
            value: selectedValue,
            items: ['one', 'two'].map((value) {
              return DropdownMenuItem<String>(
                value: value,
                child: Text(value),
              );
            }).toList(),
            onChanged: (value) {
              setState(() {
                selectedValue = value;
              }); 
            },
          ),
          RaisedButton(
            child: Text('test'),
            onPressed: (){
              setState(() {
                selectedValue = 'two';
              });
            },
          ),
        ],
      ),
    );
  }
}

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Определите переменную экземпляра из глобального ключа и передайте ее в DropdownButtonFormField

final dropdownState = GlobalKey<FormFieldState>();

Вы можете изменить значение dropDownFieldItem, вызвав этот метод

dropdownState.currentState.didChange('two');

final код:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Testing(),
    );
  }
}

class Testing extends StatefulWidget {
  @override
  _TestingState createState() => _TestingState();
}

class _TestingState extends State<Testing> {
  String selectedValue;
  final dropdownState = GlobalKey<FormFieldState>();

  @override
  Widget build(BuildContext context) {
    return Material(
      child: Column(
        children: <Widget>[
          DropdownButtonFormField(
            key: dropdownState,
            value: selectedValue,
            items: ['one', 'two'].map((value) {
              return DropdownMenuItem<String>(
                value: value,
                child: Text(value),
              );
            }).toList(),
            onChanged: (value) {
              setState(() {
                selectedValue = value;
              });
            },
          ),
          RaisedButton(
            child: Text('test'),
            onPressed: () {
              dropdownState.currentState.didChange('one');
            },
          ),
        ],
      ),
    );
  }
}
1 голос
/ 03 июня 2020

В версии Flutter 1.17.2 эта ошибка была исправлена, поэтому обязательно обновите ее.

Проблема с Github: https://github.com/flutter/flutter/issues/56898

Исправлено в версии 1.17.2 : https://github.com/flutter/flutter/wiki/Hotfixes-to-the-Stable-Channel#1172 -28 мая-2020

1 голос
/ 04 мая 2020

Здесь нормально работает с DropdownButtonFormField и DropdownButton.

flutter --version

Flutter 1.12.13+hotfix.9 • channel stable •
...