gpt4 book ai didi

Flutter DorpDownMenu 选中项不改变

转载 作者:IT王子 更新时间:2023-10-29 06:52:33 24 4
gpt4 key购买 nike

在下面的代码中,当我尝试更改 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com