Flutter中如何获取DropdownButton的选定索引

28

如何在Flutter中获取下拉菜单的selectedIndex?

在DropdownButton中,没有属性可以获取选定的索引,如果需要获取选定的索引,您可以这样做:

new DropdownButton( hint:new Text("Select a users"),value: selectedUser,

              onChanged: (String newValue) {
                setState(() {
                  selectedUser = newValue;
                });
              },
              items: userInfoToMap.map((ListOfUsers value) {
                return new DropdownMenuItem<String>(
                    value: value.name,
                    child:new Text(value.name,style: new TextStyle(color: Colors.black))
                );
              })
                  .toList(),
            ),

          ),),

选中的用户不应该是一个全局变量吗?当你选择一个项目时,onChange会被调用吗? - user1462442
你能给我一个例子吗?谢谢回复。 - siva kumar
userInfoToMap.indexOf(newValue) 是什么意思? - Günter Zöchbauer
如果我有多个相同的元素,那么它将失败。 - siva kumar
你可以将它们包装在对象中,这样每个对象就会不同(如果对象没有自定义的==实现)。 - Günter Zöchbauer
3个回答

36

你应该使用自定义模型对象(例如User)作为DropdownButton的类型。

video

import 'package:flutter/material.dart';

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

class User {
  const User(this.name);    
  final String name;
}

class MyApp extends StatefulWidget {
  State createState() => new MyAppState();
}

class MyAppState extends State<MyApp> {
  User selectedUser;
  List<User> users = <User>[User('Foo'), User('Bar')];    
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Center(
          child: new DropdownButton<User>(
            hint: new Text("Select a user"),
            value: selectedUser,
            onChanged: (User newValue) {
              setState(() {
                selectedUser = newValue;
              });
            },
            items: users.map((User user) {
              return new DropdownMenuItem<User>(
                value: user,
                child: new Text(
                  user.name,
                  style: new TextStyle(color: Colors.black),
                ),
              );
            }).toList(),
          ),
        ),
      ),
    );
  }
}

4
我们如何设置初始值? - Ammy Kang
1
为了以后的参考,如果有人正在寻找解决方案。您可以通过在DropdownButton中提供一个值来设置初始值。您需要确保您的value参数与列表匹配。 - IntFooBar
1
那么如何获取索引呢?我还是没明白。 - Md. Kamrul Amin
回答你的问题@KamrulHasanJony,这是一个自定义对象的列表。这正是我所需要的,因为我正在使用本地化,而不同语言的列表是不同的。 - Bhikkhu Subhuti
解决了我的问题....捆绑在一起,谢谢..... - Aqeel Mughal

35
类似于Collin Jackson的回答,你可以简单地使用一个字符串列表并检查indexOf来设置值,在某些情况下这可能比创建一个User类更可取。 如果你想设置初始值,请在定义时将_user设为整数值。
int _user;
...

var users = <String>[
  'Bob',
  'Allie',
  'Jason',
];

return new DropdownButton<String>(
  hint: new Text('Pickup on every'),
  value: _user == null ? null : users[_user],
  items: users.map((String value) {
    return new DropdownMenuItem<String>(
      value: value,
      child: new Text(value),
    );
  }).toList(),
  onChanged: (value) {
    setState(() {
      _user = users.indexOf(value);
    });
  },
);

2
这行代码解决了我的问题'value: _user == null ? null : users[_user]',谢谢 :)。 - Shadi
2
当我们有多个具有相同字符串的值时,这可能无法正常工作。假设我们有var users = <String>[ 'Bob', 'Bob Martins', 'Allie', 'Jason', 'Jason Derulo']; 这种方法会有错误。 - kimoduor
当我尝试做同样的事情,从下拉列表项中获取索引时,我会得到RangeError(index):无效值:不在包括范围0..5:-1。 - Md. Kamrul Amin

1
这将为您提供下拉列表的选定索引。
userInfoToMap.indexOf(selectedUser);

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