Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio 如何在没有StatefulWidget的情况下使用setState?_Android Studio_Flutter_Dart - Fatal编程技术网

Android studio 如何在没有StatefulWidget的情况下使用setState?

Android studio 如何在没有StatefulWidget的情况下使用setState?,android-studio,flutter,dart,Android Studio,Flutter,Dart,首先,我知道这不太可能,但我有一个问题,我不知道该怎么办。 我想使用下拉菜单,但它不会改变没有设置状态的文本,我无法将此代码转换为StatefulWidget。我该怎么办?代码实际上并不重要,但在这里(不是全部代码): Widget buildAboutDialog( BuildContext上下文,_myHomePageState、bool iEdit、衣服){ 如果(衣服!=null){ 这件衣服=衣服; teCategoryName=衣服.category; teBrandName.tex

首先,我知道这不太可能,但我有一个问题,我不知道该怎么办。 我想使用下拉菜单,但它不会改变没有设置状态的文本,我无法将此代码转换为StatefulWidget。我该怎么办?代码实际上并不重要,但在这里(不是全部代码):

Widget buildAboutDialog(
BuildContext上下文,_myHomePageState、bool iEdit、衣服){
如果(衣服!=null){
这件衣服=衣服;
teCategoryName=衣服.category;
teBrandName.text=衣服.brand;
teColorName.text=衣服.color;
teSizeName.text=衣服.size;
teQtyName.text=衣服数量;
}
返回新警报对话框(
标题:新文本(iEdit?编辑“:“添加新衣服”),
内容:新建SingleChildScrollView(
子:新列(
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
儿童:中心(
孩子:下拉按钮(
提示:文本(“选择类别”),
值:teCategoryName,
是的,
一旦更改:(newValue){
teCategoryName=新值;
**设置状态(){
teCategoryName=新值;
});**
},
项目:_categorynames.map((位置){
返回下拉菜单项(
子项:新文本(位置),
价值:位置,
);
}).toList(),
),
),
),

你不能。


setState
方法更新小部件的状态。
无状态小部件
,根据定义,没有要更新的状态。因此,如果您希望能够调用
setState
,您需要将小部件转换为
StatefulWidget
。(但是是的,任何
无状态小部件
都可以相当容易地转换为
状态小部件

我无法将此代码转换为StatefulWidget
这种假设是错误的。你总是可以。为什么你认为你不能?我尝试了5次,总是出现一些错误,这是完整的代码:你认为它可以转换吗?我可以再试一次,但我觉得有其他错误。我可以转换它,但我得到的是error及其工作不正常。这是我得到的:E/flutter(14185):[ERROR:flutter/lib/ui/ui_dart_state.cc(157)]未处理的异常:在构造函数中调用setState():addCloseDialog#3e267(生命周期状态:已创建,无小部件,未安装)E/flutter(14185):调用setState()时会发生这种情况在尚未插入到小部件树中的小部件的状态对象上。无需在构造函数中调用setState(),因为在初始创建状态时已假定该状态为脏状态。@Matelevi12您不能(也不应该)在第一次构建小部件之前,在小部件上调用
setState
。如果使用
if(mounted){…}
。感谢您的帮助,我再也不会收到错误消息了,虽然这很好,但仍然不会更改文本。@Matelevi12您具体在谈论什么文本?如果您在对话框中谈论文本,它不会更新的原因是因为对话框小部件是它自己的页面,具有自己的状态。当您调用
setState
,您可以正在更新本地小部件的状态,而不是对话框的状态。如果希望更新对话框,则需要将该代码提取到自定义的
对话框
小部件中,并使用
StatefulWidget
实现它。
  Widget buildAboutDialog(
      BuildContext context, _myHomePageState, bool isEdit, Clothes clothes){
    if(clothes != null){
      this.clothes = clothes;
      teCategoryName = clothes.category;
      teBrandName.text = clothes.brand;
      teColorName.text = clothes.color;
      teSizeName.text = clothes.size;
      teQtyName.text = clothes.qty;
    }
   return new AlertDialog(
      title: new Text(isEdit ? 'Edit' : 'Add new Clothes'),
      content: new SingleChildScrollView(
        child: new Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Container(

              child: Center(
                child: DropdownButton(
                  hint:  Text("Choose Category"),
                  value: teCategoryName,
                  isExpanded: true,
                  onChanged: (newValue){
                    teCategoryName = newValue;
                    **setState(() {
                      teCategoryName = newValue;
                    });**

                  },
                  items: _categorynames.map((location){
                    return DropdownMenuItem(
                      child: new Text(location),
                      value: location,
                    );
                  }).toList(),

                ),
              ),
            ),