dart 如何防止Flutter中下拉菜单的变化?

ijxebb2r  于 2022-12-16  发布在  Flutter
关注(0)|答案(2)|浏览(142)

我试图询问用户,按下下拉菜单后是否确定要更改数据。
目前,我在onChanged之后启动一个警报对话框。询问用户“是否确实要更改数据?"。如果是,我保存数据更改。如果否,我关闭警报对话框。
但如果用户选择“否”,则数据已更改,我不想更改数据...如何停止更改?我有一个复杂的解决方案,即保存所有数据更改,当用户按“否”时,我加载“否”之前保存的最后一次数据,但我发现这太复杂了。是否有其他更简单的解决方案?谢谢
下面是我的代码:

new DropdownButton<String>(
    onChanged: (String changedValue) {
        dialog(); //lanche dialog with choice of data modification
        data=changedValue;
        setState(() {
            data;
            });
        },
        value: data,
        items: <String>['data1', 'data2', 'data3','data4', 'data5']
             .map((String changedValue) {
                 return new DropdownMenuItem<String>(
                     value: changedValue,
                     child: new Text(changedValue),
                     );
             }).toList()),
gfttwv5a

gfttwv5a1#

应该更新决策函数中的setState数据值,检查以下代码。

new DropdownButton<String>(
  onChanged: (String changedValue) {
    _showDialog(changedValue); // I changed this.
  },
  value: data,
  items: <String>['data1', 'data2', 'data3', 'data4', 'data5']
    .map((String changedValue) {
      return new DropdownMenuItem<String>(
        value: changedValue,
        child: new Text(changedValue),
      );
}).toList()),



void _showDialog(selection) {
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: new Text("Alert Dialog title"),
        content: new Text("Alert Dialog body"),
        actions: <Widget>[
          new FlatButton(
            child: new Text("No"),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
          new FlatButton(
            child: new Text("Yes"),
            onPressed: () {
              // this is where data value updates.
              setState(() {
                data = selection;
              });
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    },
  );
}
xurqigkl

xurqigkl2#

我知道现在回答这个问题已经太晚了,因为这个问题是在4年前提出的,但是我想有些人会像我一样回答这个问题,这里是你们的答案。
我们可以通过在下拉按钮的状态键上调用reset方法,将下拉按钮的值重置为其初始值。
1.在小部件或屏幕的状态类中声明DropDownButton小部件的全局键

final _dropDownKey = GlobalKey<FormFieldState>();

1.在下拉按钮的构造函数中附加键
1.现在可以从下拉键的当前状态调用reset方法,将下拉值重置为其初始值。

_dropDownKey.currentState?.reset();

在我的情况下当用户在确认对话框中轻敲“否”时,我必须在下拉列表中设置旧值。我所做的是通过async/await等待警报对话框的结果(警报对话框返回一个可以为空的布尔值)。当弹出窗口关闭时,将返回一个布尔值或空值。我添加了一个if语句,以便在警报对话框返回false或null时重置下拉列表值(这意味着用户点击“否”按钮或用户通过点击空白区域关闭对话框)。

Future<void> _showDropDownChangeConfirmAlert(BuildContext context, FBO? fbo){
...... 
final isChangeConfirmed = await AlertDialogUtils.showConfirmationDialog(
      context,
      title: title,
      content: content,
      onPrimaryActionPressed: () => widget.onFboSelected.call(fbo),
    );
    // If the user taps on No in the confirmation dialog
    // Below code resets the dropdown value to the old selected FBO
    if ((isChangeConfirmed ?? false) == false) {
      if (mounted) {
        _dropDownKey.currentState?.reset();
      }
    }
....
}

附言:AlertDialogUtils是我项目中的一个类。它在你的项目中不起作用。复制想法而不是代码:)

相关问题