为啥小部件的状态在颤动时没有改变?

Posted

技术标签:

【中文标题】为啥小部件的状态在颤动时没有改变?【英文标题】:Why the state of widgets is not changing on flutter?为什么小部件的状态在颤动时没有改变? 【发布时间】:2021-05-23 08:13:52 【问题描述】:

我正在使用一个变量列,其子项具有有状态的方法,例如:

String word = 'hi';
Column c = Column(
children: [
FlatButton(
child(Text(word)),
onPressed() 
setState(
word += word;
)

) // Flat Button
]
);

但是 setState 对我不起作用,这是完整的代码:

 Widget build(BuildContext context) 

    Column questionsForm;
    Map answers = Map();
    Map sortedQuestions;

    return Scaffold(
      backgroundColor: Colors.grey[200],
      body: SingleChildScrollView(
        child: SafeArea(
          child: Padding(
              padding: const EdgeInsets.all(25.0),
              child: Column(
                children: [
                StreamBuilder(
                  stream: partEnrollment.snapshots(),
                  builder: (context, snapshot) 
                    answers = Map();
                    questionsForm = Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        SizedBox(
                          height: 25,
                        )
                      ],
                    );
                    

                    for (String q in questions.keys) answers[q] = -1;

                    for (String q in questions.keys) 
                 
                        questionsForm.children.add(Text(
                          questions[q],
                          style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                        ));
                        questionsForm.children.add(Row(
                          children: [
                            FlatButton(
                              onPressed: () 

                                setState(() 
                                  answers[q] = 0;
                                  print(answers[q]);
                                );

                              ,
                              child: Text(
                                'Yes',
                                style: TextStyle(
                                    fontSize: 17,
                                    fontWeight:
                                    answers[q] == 0 ? FontWeight.bold : FontWeight.normal),
                              ),
                            ),
                            FlatButton(
                              onPressed: () 
                                setState(() 
                                  answers[q] = 1;
                                  print(answers[q]);
                                );
                              ,
                              child: Text(
                                'No',
                                style: TextStyle(
                                    fontSize: 17,
                                    fontWeight:
                                    answers[q] == 1 ? FontWeight.bold : FontWeight.normal),
                              ),
                            )
                          ],
                        ));
                     
                      
                    

                    return questionsForm;
                  ,
                ), //Stream builder

我尝试了许多其他方法,例如将它放入带有自己的状态生成器的单选列表中,但它不起作用,当我按下按钮时,数字会改变, 这是屏幕截图: questions form

【问题讨论】:

【参考方案1】:

我认为您在 build 方法中维护以下变量。因此,每次您(重建)调用setState(()) 时,它都会初始化为一个新元素。如果您在 build 方法之外维护以下变量,它将起作用。

    Column questionsForm;
    Map answers = Map();
    Map sortedQuestions; 

【讨论】:

以上是关于为啥小部件的状态在颤动时没有改变?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动的另一个有状态小部件中访问在一个有状态小部件中创建的对象

在颤动中单击按钮时添加小部件时处理动态复选框列表

在文本小部件中为不同的字母颤动不同的颜色

有没有办法在不使用材料小部件的情况下提升小部件的颤动?

如何在颤动中从父小部件访问所有孩子的状态?

测试小部件时在颤动中测试 BlocListener 失败