以编程方式更改DropdownButtonFormField的值

6

我正在尝试使用setState在事件(例如按钮按下)时更改DropdownButtonFormField的值。但它不起作用。

注意:如果我使用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个回答

15

使用全局键定义实例变量,并将其传递给 DropdownButtonFormField

final dropdownState = GlobalKey<FormFieldState>();

您可以通过调用此方法更改dropDownFieldItem的值。

dropdownState.currentState.didChange('two');

最终代码:
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

使用 DropdownButtonFormFieldDropdownButton 正常工作。

flutter --version

Flutter 1.12.13+hotfix.9 • channel stable •

我升级了Flutter并进行了测试,它在稳定通道上运行正常。但是在beta通道上无法工作。我正在使用Flutter Web,这就是为什么我要使用beta通道的原因。非常感谢您的回答。 - Feras Senjab

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接