4
DropdownButton Value does not update even after selecting different items.

如果默认值为空,则显示错误消息,如果我传递任何默认值(非空),则它永远不会更改为其他选定的值。

currentCategory 设置为 DropdownButton 的默认值。

StreamBuilder<QuerySnapshot>(
                    stream: Firestore.instance
                        .collection('categories')
                        .snapshots(),
                    builder: (BuildContext context,
                        AsyncSnapshot<QuerySnapshot> snapshot) {
                      currentCategory = snapshot.data.documents[0];
                      return DropdownButtonHideUnderline(
                        child:
                            new DropdownButtonFormField<DocumentSnapshot>(
                          value: currentCategory,
                          onChanged: (DocumentSnapshot newValue) {
                            setState(() {
                              currentCategory = newValue;
                            });
                            print(currentCategory.data['name']);
                          },
                          onSaved: (DocumentSnapshot newValue) {
                            setState(() {
                              currentCategory = newValue;
                            });
                          },
                          items: snapshot.data.documents
                              .map((DocumentSnapshot document) {
                            return new DropdownMenuItem<DocumentSnapshot>(
                              value: document,
                              child: Text(
                                document.data['name'],
                              ),
                            );
                          }).toList(),
                        ),
                      );
                    }),

帮我解决这个问题。提前致谢。

4

2 回答 2

4

触发setState将安排新的构建(该build方法总是在收到对 的调用后调用setState)。

因此,我建议您将查询移到小部件之外并在initState语句中初始化流,以便每次状态更改时都不会计算它(除非您真的需要它)。

还将您的小部件方法移到currentCategory外部。build

像这样的东西应该工作:

class YourClass extends StatefulWidget {
  ...
}

class _YourClassState extends State<YourClass> {

  Stream<QuerySnapshot> _categories;
  DocumentSnapshot _currentCategory;

  initState() {
    _categories = Firestore.instance.collection('categories').snapshots();
    return super.initState();
  }

  Widget build(BuildContext context) {
    return Container(
      child: StreamBuilder<QuerySnapshot>(
        stream: _categories,
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          return DropdownButtonHideUnderline(
            child: new DropdownButtonFormField<DocumentSnapshot>(
              value: _currentCategory,
              onChanged: (DocumentSnapshot newValue) {
                setState(() {
                  _currentCategory = newValue;
                });
              }
            )
          )
        }
      )
    );
  }

}

另请注意,setState仅适用于有状态的小部件。

于 2019-01-13T18:46:24.003 回答
0

那是因为每次你做一个setState即使currentCategory改变了,它也会重建你的树并currentCategory = snapshot.data.documents[0];再次返回给你没有被设置的想法。

将其替换为if(currentCategory == null) currentCategory = snapshot.data.documents[0];只有在满足此条件时才会设置它。

于 2019-01-04T19:19:56.000 回答