Flutter / Dart-类型'List <DropdownMenuItem <dynamic >>'不是类型'List <DropdownMenuItem <String >>的子类型

时间:2020-11-03 14:39:37

标签: firebase flutter dart

我正在尝试在警报对话框小部件内创建一个下拉列表。菜单项需要从Firebase中拉出。到目前为止,我已经创建了警报对话框,遍历了Firebase数据并从结果中创建了一个列表。当我尝试使用列表作为下拉列表的“项目”时,我面临的问题就出现了,当我运行代码时,出现以下错误:

type 'List<DropdownMenuItem<dynamic>>' is not a subtype of type 'List<DropdownMenuItem<String>>'

这是我的代码:

class ViewSingleCard extends StatefulWidget {
  final String imgUrl;
  final String message;

  ViewSingleCard({this.imgUrl, this.message});

  @override
  _ViewSingleCardState createState() => _ViewSingleCardState(imgUrl, message);
}

class _ViewSingleCardState extends State<ViewSingleCard> {
  String imgUrl;
  String message;

  _ViewSingleCardState(this.imgUrl, this.message);

  PageController _pageController = PageController(initialPage: 0);
  int currentPage = 0;

  @override
  void dispose() {
    super.dispose();
    _pageController.dispose();
  }

  _onPageChanged(int index) {
    setState(() {
      currentPage = index;
    });
  }



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.deepPurpleAccent,
        title: Text('Viewer'),
        actions: [
          Stack(
            children: [
              IconButton(
                  icon: Icon(Icons.add),
                  onPressed: () {
                    createAlertDiaglog(context);
                  })
            ],
          )
        ],
      ),
      body: Stack(
          alignment: AlignmentDirectional.bottomCenter,
          children: <Widget>[
            PageView(
              scrollDirection: Axis.horizontal,
              controller: _pageController,
              onPageChanged: _onPageChanged,
              children: [
                Container(
                  child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Image(
                          image: FirebaseImage(imgUrl,
                              maxSizeBytes: 15 * 1024 * 1024))),
                ),
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Center(
                    child: Text(message),
                  ),
                ),
              ],
            ),
            Stack(
              children: <Widget>[
                Container(  
                  margin: const EdgeInsets.only(bottom: 35),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      for (int i = 0; i <= 1; i++)
                        if (i == currentPage)
                          SlideDots(true)
                        else
                          SlideDots(false)
                    ],
                  ),
                ),
              ],
            ),
          ]),
    );
  }

  createAlertDiaglog(BuildContext context) {
    String selectedOccasion;
    List<DropdownMenuItem> occasions = [];
    showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: Text("Add to collection"),
            content: StreamBuilder<QuerySnapshot>(
                stream: getCollectionInfo(context),
                // ignore: missing_return
                builder: (context, snapshot) {
                  if (!snapshot.hasData)
                    const Text("Loading.....");
                  else {
                    for (int i = 0; i < snapshot.data.docs.length; i++) {
                      DocumentSnapshot snap = snapshot.data.docs[i];
                      occasions.add(
                        DropdownMenuItem(
                          child: Text(
                            snap.id,
                          ),
                          value: "${snap.id}",
                        ),
                      );
                    }
                  }
                  return Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      // ignore: missing_return
                      DropdownButton<String>(
                        items: occasions,
                        hint: Text("Style"),
                        value: selectedOccasion,
                        onChanged: (String Value) {
                          setState(() {
                            selectedOccasion = Value;
                          });
                        },
                      ),
                    ],
                  );
                }),
          );
        });
  }

  Stream<QuerySnapshot> getCollectionInfo(BuildContext context) async* {
    yield* FirebaseFirestore.instance
        .collection('collections')
        .doc(FirebaseAuth.instance.currentUser.uid)
        .collection('occasions')
        .snapshots();
  }
}

有帮助吗?谢谢

2 个答案:

答案 0 :(得分:1)

解决方法是,在此处添加<String>

                      occasions.add(
                        DropdownMenuItem<String>(
                          child: Text(

并修复列表的类型(由于@nvoigt的回答)

List<DropdownMenuItem<String>> occasions = [];

您的DropDownButton被赋予了<String>类型,因此它期望从其项目中得到相同的结果。

每当您收到此异常时,只需交换两种类型的位置并考虑分配即可。这意味着您正在尝试进行这种分配

List<DropdownMenuItem<String>> a;
List<DropdownMenuItem<dynamic>> b;
a = b;

答案 1 :(得分:0)

此:

List<DropdownMenuItem> occasions = [];

是一个List<DropdownMenuItem<dynamic>>,但是您想要一个List<DropdownMenuItem<String>>,因此需要将其设置为一个:

List<DropdownMenuItem<String>> occasions = [];

那是说:您有一台分析仪。不要不要忽略它的警告。您忽略了错误的正确警告。不要这样做。不要忽略错误,修复错误。