Flutter 颤振DORPDOWN菜单所选项目don';不变

Flutter 颤振DORPDOWN菜单所选项目don';不变,flutter,Flutter,在下面的代码中,当我尝试在下拉菜单上更改项目时,所选项目不会更改,所选项目是列表的第一项 例如,在选择bbbbbi haveaaaaaaa或选择ccccccci haveaaaaaaa import 'package:flutter/material.dart'; void main()=>runApp( MaterialApp( home: _MyApp(), ), ); class _MyApp extends StatefulWidget { @overrid

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

例如,在选择
bbbbb
i have
aaaaaaa
或选择
ccccccc
i have
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);
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(
材料聚丙烯(
主页:_MyApp(),
),
);
类_MyApp扩展StatefulWidget{
@凌驾
State createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
会话实体会话数据;
@凌驾
小部件构建(构建上下文){
列表-下拉菜单项;
_dropdownMenuItems=buildDropdownMenuItems();
sessionData=\u dropdownMenuItems[0]。值;
返回脚手架(
正文:DropdownButtonHideUnderline(
儿童:主题(
数据:Theme.of(context).copyWith(
画布颜色:颜色。白色,
),
子:容器(
儿童:中心(
孩子:下拉按钮(
项目:_下拉菜单项,
是的,
值:sessionData,
onChanged:onChangeDropdownItem,
是的,
提示:文本('请选择项目'),
),
),
),
),
),
);
}
列表buildDropdownMenuItems(){
列表会话=[
会话实体(1,'aaaaaaa',1,'a-a-a-a'),
会话实体(2,'bbbbb',2,'b-b-b-b'),
会话实体(3,'ccccccc',2,'c-c-c-c'),
];
列表项=列表();
for(会话中的会话实体会话){
items.add(
下拉菜单项(
价值:会话,
子项:文本(session.sessionName),
),
);
}
退货项目;
}
onChangeDropdownItem(会话实体选择会话){
设置状态(){
sessionData=所选会话;
});
}
}
类会话实体{
最终int id;
字符串sessionName;
int会话类型;
字符串日期时间;
SessionsEntity(this.id、this.sessionName、this.sessionType、this.dateTime);
}

以下内容将对您有所帮助。示例小部件用于选择原因

小部件代码示例:

Widget dropdownReasons() {    
      return new DropdownButton<String>(
          value: _currentReason,
          items: _dropDownMenuItems,
          onChanged: changedDropDownItem);
    }
  }
Widget dropdownReasons(){
返回新的下拉按钮(
值:_currentReason,
项目:_下拉菜单项,
onChanged:changedDropDownItem);
}
}
下面的函数处理更改下拉值时的操作:

void changedDropDownItem(String selectedReason) {
    setState(() => _currentReason = selectedReason; // <-- This is the most important line
  }
void changedDropDownItem(字符串选择原因){

setState(()=>\u currentReason=selectedReason;//问题在下面一行

sessionData=\u dropdownMenuItems[0]。值;

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

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

您应该声明使用
\u dropdownMenuItems
列表作为类变量,而不是在
build()
中,并使用
initState()
方法仅初始化
\u 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
  }
}
class\u MyApp扩展StatefulWidget{
@凌驾
State createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
//从生成方法中删除以下行
列表-下拉菜单项;
会话实体会话数据;
@凌驾
void initState(){
super.initState();
_dropdownMenuItems=buildDropdownMenuItems();
sessionData=\u dropdownMenuItems[0]。值;
}
@凌驾
小部件构建(构建上下文){
//代码的其余部分保持不变
}
}

试试下面的代码,这样就可以了

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(home: new MyApp(),),
  );
}
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  SessionsEntity sessionData;
  List<DropdownMenuItem<SessionsEntity>> _dropdownMenuItems;

// Build method is called whenever there is change in the state or ui, so instead of initializing the dropdown menu items and initial selected value of dropdown menu in build method you should initialize it in initState method which is called only once.

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

  @override
  Widget build(BuildContext context) {
    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);
}

导入“包装:颤振/材料.省道”;
void main(){
runApp(MaterialApp(主页:new MyApp(),),
);
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
会话实体会话数据;
列表-下拉菜单项;
//每当状态或ui发生更改时,都会调用Build方法,因此不应在Build方法中初始化下拉菜单项和下拉菜单的初始选定值,而应在initState方法中初始化它,该方法只调用一次。
@凌驾
void initState(){
//TODO:实现initState
_dropdownMenuItems=buildDropdownMenuItems();
sessionData=\u dropdownMenuItems[0]。值;
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:DropdownButtonHideUnderline(
儿童:主题(
数据:Theme.of(context).copyWith(
画布颜色:颜色。白色,
),
子:容器(
儿童:中心(
孩子:下拉按钮(
项目:_下拉菜单项,
是的,
值:sessionData,
onChanged:onChangeDropdownItem,
是的,
提示:文本('请选择项目'),
),
),
),
),
),
);
}
列表buildDropdownMenuItems(){
列表会话=[
会话实体(1,'aaaaaaa',1,'a-a-a-a'),
会话实体(2,'bbbbb',2,'b-b-b-b'),
会话实体(3,'ccccccc',2,'c-c-c-c'),
];
列表项=列表();
for(会话中的会话实体会话){
items.add(
下拉菜单项(
价值:会话,
子项:文本(session.sessionName),
),
);
}
退货项目;
}
onChangeDropdownItem(会话实体选择会话){
设置状态(){
sessionData=所选会话;
});
}
}
S类