设置flutter中下拉按钮的默认值

问题描述 投票:0回答:6

我有一个可以正常工作的下拉按钮,但是当我尝试设置默认值时,它将失败并出现以下错误:

'package:flutter/src/material/dropdown.dart': 断言失败:第 620 行 pos 15: 'items == null || items.isEmpty ||值==空|| items.where((DropdownMenuItem item) => item.value == value).length == 1': 不是 true。

这是我的下拉按钮:

 Widget changeWorkspace() {
return StatefulBuilder(
    builder: (BuildContext context, StateSetter setState) {
  return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
    Padding(
      padding: EdgeInsets.all(8.0),
      child: DropdownButton<AssignedWorkspace>(
          isExpanded: true,
          hint: Text("SELECT WORKSPACE"),
          value: selectedWorkspace,
          onChanged: (dropdownValueSelected) {
            setState(() {
              selectedWorkspace = dropdownValueSelected;
            });
          },
          items: workspaces != null && workspaces.length > 0
              ? workspaces.map((AssignedWorkspace workspace) {
                  return new DropdownMenuItem<AssignedWorkspace>(
                    value: workspace,
                    child: new Text(workspace.name,
                        style: new TextStyle(color: Colors.black)),
                  );
                }).toList()
              : null),
    ),
  ]);
});

}

我尝试按如下方式设置 selectedWorkspace onInit 的值,但失败了。

selectedWorkspace = new AssignedWorkspace(
id: userSettings.currentWorkspaceId,
name: userSettings.currentWorkspaceName);

有没有办法在下拉按钮中设置默认值?

flutter dropdown default-value dropdownbutton
6个回答
23
投票
import 'package:flutter/material.dart';

import '../config/app_theme.dart';

class DropdownWidget extends StatefulWidget {
  final String title;
  final List<String> items;
  final ValueChanged<String> itemCallBack;
  final String currentItem;
  final String hintText;

  DropdownWidget({
    this.title,
    this.items,
    this.itemCallBack,
    this.currentItem,
    this.hintText,
  });

  @override
  State<StatefulWidget> createState() => _DropdownState(currentItem);
}

class _DropdownState extends State<DropdownWidget> {
  List<DropdownMenuItem<String>> dropDownItems = [];
  String currentItem;
  AppTheme appTheme;

  _DropdownState(this.currentItem);

  @override
  void initState() {
    super.initState();
    for (String item in widget.items) {
      dropDownItems.add(DropdownMenuItem(
        value: item,
        child: Text(
          item,
          style: TextStyle(
            fontSize: 16,
          ),
        ),
      ));
    }
  }

  @override
  void didUpdateWidget(DropdownWidget oldWidget) {
    if (this.currentItem != widget.currentItem) {
      setState(() {
        this.currentItem = widget.currentItem;
      });
    }
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    appTheme = AppTheme(Theme.of(context).brightness);

    return Container(
      margin: EdgeInsets.symmetric(vertical: 10),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Container(
            margin: EdgeInsets.only(left: 6),
            child: Text(
              widget.title,
              style: appTheme.activityAddPageTextStyle,
            ),
          ),
          Container(
            padding: EdgeInsets.symmetric(vertical: 3, horizontal: 15),
            margin: EdgeInsets.only(top: 10),
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(6),
              color: Colors.white,
              boxShadow: [
                BoxShadow(
                  offset: Offset(0, 2),
                  blurRadius: 10,
                  color: Color(0x19000000),
                ),
              ],
            ),
            child: DropdownButtonHideUnderline(
              child: DropdownButton(
                icon: appTheme.activityAddPageDownArrowSVG,
                value: currentItem,
                isExpanded: true,
                items: dropDownItems,
                onChanged: (selectedItem) => setState(() {
                  currentItem = selectedItem;
                  widget.itemCallBack(currentItem);
                }),
                hint: Container(
                  child: Text(widget.hintText, style: appTheme.hintStyle),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

这是我没有优化的dropDownWidget。它有当前项目。你可以这样使用它:

           DropdownWidget(
                title: kStatus,
                items: state.customerStepInfo.statusList,
                currentItem: status,
                hintText: kCommonPick,
                itemCallBack: (String status) {
                  this.status = status;
                },
              )

2
投票

您需要在AssignedWorkspace类中实现“equals”。我使用了 equatable 包。

AssignedWorkspace 类示例

class AssignedWorkspace extends Equatable {
  final String id;
  final String name;

  AssignedWorkspace(this.id, this.name);
   
  @override
  List<Object> get props => [id];
}

0
投票

我最初将下拉变量的值更改为 1

var _value = '1';
因此,当下拉按钮必须显示其
value
时,它会显示我已将其值设置为 1 的值,如
items
 中的 
DropDownButton

列表中所示
DropdownButton(
                underline: Container(),
                onChanged: (value) {
                  setState(() {
                    _value = value;
                  });
                },
                value: _value,
                items: [
                  DropdownMenuItem(
                    value: "1",
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: <Widget>[
                        Icon(MaterialCommunityIcons.devices),
                        SizedBox(width: 10),
                        Text(
                          "Consumption",
                          style: TextStyle(
                              fontSize: 18.0, fontWeight: FontWeight.w600),
                        ),
                      ],
                    ),
                  ),
                  DropdownMenuItem(
                    value: "2",
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: <Widget>[
                        Icon(MaterialCommunityIcons.solar_panel),
                        SizedBox(width: 10),
                        Text(
                          "Generation",
                          style: TextStyle(
                              fontSize: 18.0, fontWeight: FontWeight.w600),
                        ),
                      ],
                    ),
                  ),
                ],
              ),

0
投票

对我来说,其中一个元素的 id 为 null,一旦添加 id 为非空,问题就得到解决。


0
投票

如果您只想查看初始值,您可以使用名为下拉按钮参数的提示文本并设置文本小部件。我不知道这是否是一个好的做法。


0
投票
 DropdownButtonFormField(
          value: '12',
          isExpanded: true,
          icon: const HeroIcon(
            HeroIcons.chevronDown,
            // solid: true,
            color: Color(0xff656565),
            size: 30,
          ),
          decoration: InputDecoration(
            fillColor: Colors.white,
            contentPadding: const EdgeInsets.fromLTRB(15, 0, 15, 0),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8),
            ),
            focusedBorder: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8),
              borderSide: const BorderSide(
                color: Colors.grey,
              ),
            ),
            enabledBorder: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8),
              borderSide: const BorderSide(
                color: Colors.grey,
              ),
            ),
          ),
          style: tBodyTextNew,
          onChanged: (value) {
            print(value);
            controller.provinsi.value = int.parse(value.toString());
            kabupaten.kabupaten(req: value);
          },
          items: controller.listProvice.map((value) {
            return DropdownMenuItem<String>(
              value: value.idwilayahProvinsi.toString(),
              child: Text(
                value.namaProvinsi,
                style: tBodyTextNew,
              ),
            );
          }).toList(),
        ),

将值转换为字符串

© www.soinside.com 2019 - 2024. All rights reserved.