flutter - 无法更改下拉按钮值 Flutter

标签 flutter google-cloud-firestore drop-down-menu dropdownbutton

我想从firebase中获取Dropdown按钮的初始值; 但是当我尝试在构建方法内设置 governorateDDValue = selectedUser.governorate; Dropdown 的值从 firebase 获取值,但我无法更改它

DropdownButton.gif

这是我的代码

class UserInfo extends StatefulWidget {
  static const routeName = '/UserInfoScreen';

  const UserInfo({Key? key}) : super(key: key);

  @override
  _UserInfoState createState() => _UserInfoState();
}

class _UserInfoState extends State<UserInfo> {

  late User selectedUser;
  final date = DateFormat('yyyy-MM-dd').format(DateTime.now()).toString();

  var governorateDDValue;

  @override
  Widget build(BuildContext context) {

    final userList= Provider.of<List<User>>(context);
    final userID = ModalRoute.of(context)!.settings.arguments as String;
    selectedUser =
        userList.firstWhere((user) => user.id == userID);

    // this line makes dropdown value always equal to value from firestore
    governorateDDValue = selectedUser.governorate;

    return Scaffold(
      appBar: AppBar(
        title: Text('report'),
      ),
      body: SingleChildScrollView(
        child: Container(
          child: Row(
            children: <Widget>[
                    Text('Governorate',),
                    Container(height: 5),
                    DropdownButton<String>(
                      value: governorateDDValue,
                      icon: const Icon(Icons.arrow_downward),
                      iconSize: 24,
                      elevation: 16,
                      style: const TextStyle(color: Colors.deepPurple),
                      onChanged: (String? newValue) {
                        setState(() {
                          governorateDDValue = newValue!;
                        });
                      },
                      items: Constants.governoratesOfEgypt
                          .map<DropdownMenuItem<String>>((String value) {
                        return DropdownMenuItem<String>(
                          value: value,
                          child: Text(value),
                        );
                      }).toList(),
          ),
        ],
      ),
    ),
  ),
);

} }

提前致谢

最佳答案

因为您在构建小部件中使用了 governorateDDValue = selectedUser.governorate;,因此每次更改下拉菜单时都会重置其值 构建小部件将重建,并且下拉列表的值将保持等于 firebase 中的值 您应该在构建小部件之外使用 governorateDDValue = selectedUser.governorate; 这段代码应该可以工作

class UserInfo extends StatefulWidget {
  static const routeName = '/UserInfoScreen';

  const UserInfo({Key? key}) : super(key: key);

  @override
  _UserInfoState createState() => _UserInfoState();
}

class _UserInfoState extends State<UserInfo> {

  var loading = false;

  late User selectedUser;
  final date = DateFormat('yyyy-MM-dd').format(DateTime.now()).toString();

  var governorateDDValue;


  @override
  void initState() {
    super.initState();
    loading = true;
    print('Future.delayed outside');
    print(loading);
    Future.delayed(Duration.zero, () {
      governorateDDValue = selectedUser.governorate;
      setState(() {
        loading = false;
      });
    });
  }


  @override
  Widget build(BuildContext context) {
    final userList = Provider.of<List<User>>(context);
    final userID = ModalRoute
        .of(context)!
        .settings
        .arguments as String;
    selectedUser =
        userList.firstWhere((user) => user.id == userID);

    // this line makes dropdown value always equal to value from firestore
    governorateDDValue = selectedUser.governorate;

    return Scaffold(
      appBar: AppBar(
        title: Text('report'),
      ),
      body: SingleChildScrollView(
        child: Container(
          child: Row(
            children: <Widget>[
              Text('Governorate',),
              Container(height: 5),
              DropdownButton<String>(
                value: governorateDDValue,
                icon: const Icon(Icons.arrow_downward),
                iconSize: 24,
                elevation: 16,
                style: const TextStyle(color: Colors.deepPurple),
                onChanged: (String? newValue) {
                  setState(() {
                    governorateDDValue = newValue!;
                  });
                },
                items: Constants.governoratesOfEgypt
                    .map<DropdownMenuItem<String>>((String value) {
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(value),
                  );
                }).toList(),
              ),
            ],
          ),
        ),
      ),
    );

关于flutter - 无法更改下拉按钮值 Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68900516/

相关文章:

javascript - 无法在下拉菜单中重新定义 div 高度

javascript - 基于下拉列表中所选选项的 Angular 验证

html - 如何使用 CSS 自定义选择下拉框?

javascript - 如何通过在 flutter 中知道其值来删除 key ?

xcode - flutter 卡在运行xcode构建

android - 发布 http 请求 : The getter 'length' was called on null flutter

Firebase Firestore : How to monitor read document count by collection?

flutter - 如何检查背景颜色的亮度以确定写在上面的文本颜色

ios - 如何对字典类型中的特定值求和

swift - Firestore 数据库不存储数据