【问题标题】:Flutter/Dart - type 'List<DropdownMenuItem<dynamic>>' is not a subtype of type 'List<DropdownMenuItem<String>>Flutter/Dart - 类型 'List<DropdownMenuItem<dynamic>>' 不是类型 'List<DropdownMenuItem<String>> 的子类型
【发布时间】:2020-11-03 14:39:37
【问题描述】:

我正在尝试在警报对话框小部件中创建一个下拉列表。菜单项需要从 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();
  }
}

有什么帮助吗?谢谢

【问题讨论】:

  • 我认为您的 DropdownButton 需要是 DropdownMenuItem 而不是字符串,因为您将场合放入您的项目中?

标签: firebase flutter dart


【解决方案1】:

这是解决方法,在此处添加 &lt;String&gt;

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

并且还修复了列表的类型(感谢@nvoigt 的回答)

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

您的DropDownButton 被赋予&lt;String&gt; 类型,因此它期望从它的项目中得到相同的东西。

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

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

【讨论】:

    【解决方案2】:

    这个:

    List<DropdownMenuItem> occasions = [];
    

    是一个List&lt;DropdownMenuItem&lt;dynamic&gt;&gt;,但你想要一个List&lt;DropdownMenuItem&lt;String&gt;&gt;,所以你需要把它变成一个:

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

    也就是说:你有一个分析器。不要不要忽略它的警告。你忽略了正确的警告,你犯了错误。不要这样做。不要忽略你的错误,修正它们。

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2020-12-12
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多