在下面的代码中,当我尝试更改 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() 方法来仅初始化一次 _dropdownMenuItems 和 sessionData 变量。这是一个例子-
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/
我有以下内容: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}
我正在尝试解决我们测试中的一个错误,我认为它应该有效。我很确定这是selectize或capybara中的错误,但我不明白为什么。我已经进入了capybara的源代码,一切似乎都在正常工作。我真的不确定如何前进。为了测试这个错误,我已经尽可能地把这个错误剥离成一个小的testapplication.请参阅下面的设置bugs/show.html.erbOneTwoThreeFourOneTwoThreeFourbug_spec.rbfeature'bug'doit"specsetup",js:truedovisitbug_pathfind('div.selectize-inputinpu
为什么我可以这样改变“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.
为什么下面的表达式会这样解析?括号的优先级应该高于换行符,不是吗?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-(
这个问题在这里已经有了答案:differentlayoutforsign_inactionindevise(8个答案)关闭7年前。如何更改设计Controller中的布局?
我最近注意到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
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)?提前致谢。 最佳答
我正在使用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
我需要跟踪这样设置的关联的更改(添加和删除):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
假设给您三个“选项”,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的