草庐IT

Flutter DorpDownMenu 选中项不改变

coder 2023-07-22 原文

在下面的代码中,当我尝试更改 DropDownMenu 上的项目时,所选项目不会更改,所选项目是列表的第一项

例如,在选择 bbbbbbb 我有 aaaaaaa 或选择 ccccccc 我有 aaaaaaa

import 'package:flutter/material.dart';

void main()=>runApp(
  MaterialApp(
    home: _MyApp(),
  ),
);

class _MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState()=>_MyAppState();
}

class _MyAppState extends State<_MyApp> {
  SessionsEntity sessionData;
  @override
  Widget build(BuildContext context) {
    List<DropdownMenuItem<SessionsEntity>> _dropdownMenuItems;
    _dropdownMenuItems = buildDropdownMenuItems();
    sessionData = _dropdownMenuItems[0].value;

    return Scaffold(
      body: DropdownButtonHideUnderline(
        child: Theme(
          data: Theme.of(context).copyWith(
            canvasColor: Colors.white,
          ),
          child: Container(
            child: Center(
              child: DropdownButton(
                items: _dropdownMenuItems,
                isDense: true,
                value: sessionData,
                onChanged: onChangeDropdownItem,
                isExpanded: true,
                hint: Text('please select item'),
              ),
            ),
          ),
        ),
      ),
    );
  }

  List<DropdownMenuItem<SessionsEntity>> buildDropdownMenuItems() {
    List<SessionsEntity> sessions = [
      SessionsEntity(1, 'aaaaaaa', 1, 'a-a-a-a-a'),
      SessionsEntity(2, 'bbbbbbb', 2, 'b-b-b-b-b'),
      SessionsEntity(3, 'ccccccc', 2, 'c-c-c-c-c'),
    ];
    List<DropdownMenuItem<SessionsEntity>> items = List();
    for (SessionsEntity session in sessions) {
      items.add(
        DropdownMenuItem(
          value: session,
          child: Text(session.sessionName),
        ),
      );
    }
    return items;
  }

  onChangeDropdownItem(SessionsEntity selectedSession) {
    setState(() {
      sessionData = selectedSession;
    });
  }
}

class SessionsEntity {
  final int id;
  String sessionName;
  int sessionType;
  String dateTime;
  SessionsEntity(this.id, this.sessionName,this.sessionType, this.dateTime);
}

最佳答案

问题出在下面这行。

sessionData = _dropdownMenuItems[0].value;

由于您每次都在 build() 方法中初始化 sessionData 变量,因此调用 setState() 无效。

基本上 setState() 使用新数据再次调用 build() 方法,但是当您在 build( ) 每次调用 build() 时,它都会被相同的值覆盖。

您应该将 _dropdownMenuItems 列表声明为类变量而不是在 build() 中使用,并使用 initState() 方法来仅初始化一次 _dropdownMenuItemssessionData 变量。这是一个例子-

class _MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState()=>_MyAppState();
}

class _MyAppState extends State<_MyApp> {

  //Remove below line from build method
  List<DropdownMenuItem<SessionsEntity>> _dropdownMenuItems;
  SessionsEntity sessionData;

   @override
         void initState() {
         super.initState();
         _dropdownMenuItems = buildDropdownMenuItems();
         sessionData = _dropdownMenuItems[0].value;
  }

  @override
  Widget build(BuildContext context) {

    //Rest of the code remains same
  }
}

关于Flutter DorpDownMenu 选中项不改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57159443/

有关Flutter DorpDownMenu 选中项不改变的更多相关文章

  1. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

  2. ruby - 下拉菜单在应该被选中的时候没有被选中……为什么? - 2

    我正在尝试解决我们测试中的一个错误,我认为它应该有效。我很确定这是selectize或capybara中的错误,但我不明白为什么。我已经进入了capybara的源代码,一切似乎都在正常工作。我真的不确定如何前进。为了测试这个错误,我已经尽可能地把这个错误剥离成一个小的testapplication.请参阅下面的设置bugs/show.html.erbOneTwoThreeFourOneTwoThreeFourbug_spec.rbfeature'bug'doit"specsetup",js:truedovisitbug_pathfind('div.selectize-inputinpu

  3. ruby - 为什么我不能改变 self 的值(value)? - 2

    为什么我可以这样改变“self”:self.map!{|x|x*2}或者这样:self.replace(self.map{|x|x*2})但不是这样:self=self.map{|x|x*2}为什么Ruby不允许我更改“self”变量指向的对象,但允许我更改对象的属性? 最佳答案 不是答案,只是一个线索。a=[1,2]=>[1,2]a.object_id=>2938a.map!{|x|x*2}=>[2,4]a.object_id#differentdatabutstillthesameobject=>2938a.replace(a.

  4. ruby - 为什么括号内的换行符会改变算术结果? - 2

    为什么下面的表达式会这样解析?括号的优先级应该高于换行符,不是吗?3-(1+1)#=>13-(1+1)#=>2省略加号也会让表达式计算为2:3-(11)#=>2如果我声明为连续的换行符(转义)或将加号移动到第一行,则会实现所需的行为:3-(1\+1)#=>13-(1+1)#=>1 最佳答案 这是因为Ruby将新行识别为表达式的结尾,除非表达式不完整。例如,(1+1)与相同(1;+1)这与+1相同,因为返回了括号内的最后一个表达式。这进一步与1相同。如果行尾有+,则表达式不完整,因此会继续到下一行。这使得:3-(1+1)被解释为3-(

  5. ruby-on-rails - 设计 Controller 如何改变布局? - 2

    这个问题在这里已经有了答案:differentlayoutforsign_inactionindevise(8个答案)关闭7年前。如何更改设计Controller中的布局?

  6. ruby-on-rails - Rails 3.2.13 与 Rails 4.0.1 - 改变了吗?方法变了? - 2

    我最近注意到ActiveRecord对象上的方法changed?在Rails3.2.13和Rails4.0.1之间发生了变化。问题在于连接到数据库中整数字段的字段。假设我的模型Model带有number整数字段:#Rails3.2.13m=Model.lastm.number#=>5m.number='5hello'm.number#=>5m.number_changed?#=>truem.changed?#=>truem.changes#=>{:number=>[5,5]}#Rails4.0.1m=Model.lastm.number#=>5m.number='5hello'm.nu

  7. ruby - 如何像 instance_eval 方法那样在一个 block 中改变 self 呢? - 2

    instance_eval方法在其block中改变自身,例如:classD;endd=D.newd.instance_evaldoputsself#printsomethinglike#,not'main'!end如果我们自己定义一个方法(或任何其他方法(除了instance_eval)需要一个block),当打印self时,我们将得到'main',这与instance_eval方法不同。例如:[1].eachdo|e|putsself#print'main'end我如何定义一个像instance_eval这样的方法(需要一个block)?提前致谢。 最佳答

  8. ruby-on-rails - friendly_id slug 在更新时没有改变 - 2

    我正在使用friendly_id5.0.0.rc1,还有active_admin。除了在active_admin中更新记录的slug属性/列没有做任何事情(它保持不变)之外,一切似乎都按预期完美运行我在使用控制台时发现了相同的行为:p=Post.firstp.slug#=>'test'p.slug='another-test'p.save#=>truep.slug#=>'test我的配置:FriendlyId.defaultsdo|config|config.use:reservedconfig.reserved_words=%w(adminneweditindexsessionuse

  9. ruby-on-rails - Rails 3 has_many 改变了吗? - 2

    我需要跟踪这样设置的关联的更改(添加和删除):has_many:listing_serviceshas_many:services,through::listing_services对于普通属性,最简单的方法是检查before_save或l.previous_changes[attribute]中的l.changes[attribute]>在after_save中。问题是,对于has_many属性,最好的方法是什么? 最佳答案 我没有使用changes方法。但我相信你总能使用魔法_changed?和_was:services.any

  10. ruby - 选择一个随机选项,其中每个选项被选中的概率不同 - 2

    假设给您三个“选项”,A、B和C。您的算法必须随机选择并返回一个。为此,只需将它们放在一个数组{A,B,C}中并生成一个随机数(0、1或2),这将是元素在返回数组。现在,这个算法有一个变体:假设A有40%的机会被选中,B有20%,而C40%。如果是这种情况,您可以采用类似的方法:生成一个数组{A,A,B,C,C}并生成一个随机数(0,1,2,3,4)选择要返回的元素。行得通。但是,我觉得效率很低。想象一下,将此算法用于大量选项。你会创建一个有点大的数组,可能有100个元素,每个元素代表1%。现在,这仍然不是很大,但假设您的算法每秒使用多次,这可能会很麻烦。我考虑过创建一个名为Slot的

随机推荐