【问题标题】:How do I fix the error: type '_InternalLinkedHashMap<String, List<dynamic>>' is not a subtype of type 'List<dynamic>'如何修复错误:类型 '_InternalLinkedHashMap<String, List<dynamic>>' 不是类型 'List<dynamic>' 的子类型
【发布时间】:2020-02-23 13:20:28
【问题描述】:

背景

我正在开发一个应用程序来帮助小学教师。 这个应用程序允许用户从字母表中选择字母,当他们继续到下一个屏幕时,他们选择的字母应该显示为可翻转的卡片。一侧有字母,另一侧有图像。 这些卡片应该占据整个屏幕,用户可以滑动到下一张卡片。

问题

当用户选择多个字母时,它们会被输入到一个列表中。当他们点击按钮移动到下一个屏幕(带有可翻转卡片)时,他们会收到以下错误消息:

“类型'_InternalLinkedHashMap>'不是类型'List'的子类型”

守则

以下是字母选择屏幕的代码:

import 'package:flutter/material.dart';
import 'package:project_teacher/pages/allcards.dart';

class ChooseLetters extends StatefulWidget {
  @override
  _ChooseLettersState createState() => _ChooseLettersState();
}

class _ChooseLettersState extends State<ChooseLetters> {

  List<String> alphabets = ['a','b','c','d','e','f',
    'g','h','i','j','k','l','m','n','o','p',
    'q','r','s','t','u','v','w','x','y','z'],

      selection = [];

  List alphabetCards = [AlphabetCard(),BAlphabetCard(),CAlphabetCard(),DAlphabetCard(),EAlphabetCard(),FAlphabetCard(),
    GAlphabetCard(),HAlphabetCard(),IAlphabetCard(),JAlphabetCard(),KAlphabetCard(),LAlphabetCard(),MAlphabetCard(),NAlphabetCard(),OAlphabetCard(),PAlphabetCard(),
    QAlphabetCard(),RAlphabetCard(),SAlphabetCard(),TAlphabetCard(),UAlphabetCard(),VAlphabetCard(),WAlphabetCard(),XAlphabetCard(),YAlphabetCard(),ZAlphabetCard()],

      selectionCards = [];

  @override
  void initState(){
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
            gradient: LinearGradient(
                begin: Alignment.bottomLeft,
                end: Alignment.topRight,
                colors: [Colors.blueGrey[300], Colors.blueGrey])
        ),
        padding:EdgeInsets.all(15),
        alignment: Alignment.center,
        child:GridView.builder(
          gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount:4,
            mainAxisSpacing: 10, crossAxisSpacing: 10,
          ),
          itemCount:alphabetCards.length,
          itemBuilder:(con,ind){
            return InkWell(
              onTap:(){
                setState((){
                  if(selectionCards.contains(alphabetCards[ind]))
                    selectionCards.remove(alphabetCards[ind]);
                  else
                    selectionCards.add(alphabetCards[ind]);
                });
                print(selectionCards);
              },
              child: Container(
                  padding:EdgeInsets.all(10),
                  alignment:Alignment.center,
                  decoration:BoxDecoration(
                      color:selectionCards.contains(alphabetCards[ind]) ? Colors.orange : Colors.white,
                      borderRadius:BorderRadius.circular(0)
                  ),
                  child:Text(alphabets[ind],
                      style: TextStyle(
                          color:Colors.black,
                          fontSize: 50
                      )
                  )
              ),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
          onPressed: () {
            Navigator.pushNamed(context, '/tabbedcards', arguments: {
              'selectionOfCards': selectionCards
            });
          },
        backgroundColor: Colors.red,
      ),
    );
  }

}

这是可翻转卡片屏幕的代码:

import 'package:flutter/material.dart';

class TabbedCards extends StatefulWidget {

  @override
  _TabbedCardsState createState() => _TabbedCardsState();
}

class _TabbedCardsState extends State<TabbedCards> {

  List selectionOfCards;

  @override
  Widget build(BuildContext context) {

    selectionOfCards = ModalRoute.of(context).settings.arguments;

    return MaterialApp(
      home: DefaultTabController(
        length: selectionOfCards.length,
        child: Scaffold(
          body: TabBarView(
            children: selectionOfCards
          ),
        ),
      ),
    );
  }
}

感谢您的阅读以及您可能提供的任何帮助。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您必须进行一些更改才能使其正常工作。

    List<String> alphabets = ['a','b','c','d','e','f',
        'g','h','i','j','k','l','m','n','o','p',
        'q','r','s','t','u','v','w','x','y','z'],
    
          selection = [];
    

    在这里,您正在尝试创建字符串列表并添加 selection = [] ?

    List<String> alphabets = ['a','b','c','d','e','f',
            'g','h','i','j','k','l','m','n','o','p',
            'q','r','s','t','u','v','w','x','y','z'];
    

    现在为小部件列表提供类型。

      List<Widget> alphabetCards = [
        AlphabetCard(),
        BAlphabetCard(),
        CAlphabetCard(),
        DAlphabetCard(),
        EAlphabetCard(),
         ....
      ];
      List<Widget> selectionCards = <Widget>[];
    

    现在改变你的标签视图如下。

    class _TabbedCardsState extends State<TabbedCards> {
      Map<String, List> selectionOfCards;
      List<Widget> data;
    
      @override
      Widget build(BuildContext context) {
        selectionOfCards = ModalRoute.of(context).settings.arguments;
        data = selectionOfCards['selectionOfCards'];
        print(data.toString());
        return MaterialApp(
          home: DefaultTabController(
            length: data.length,
            child: Scaffold(
              body: TabBarView(
                children: data,
              ),
            ),
          ),
        );
      }
    }
    

    完整的工作演示代码:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          initialRoute: '/',
          routes: {'/tabbedcards': (context) => TabbedCards()},
          home: ChooseLetters(),
        );
      }
    }
    
    class ChooseLetters extends StatefulWidget {
      @override
      _ChooseLettersState createState() => _ChooseLettersState();
    }
    
    class _ChooseLettersState extends State<ChooseLetters> {
      List<String> alphabets = [
        'a',
        'b',
        'c',
        'd',
        'e',
        'f',
        'g',
        'h',
        'i',
        'j',
        'k',
        'l',
        'm',
        'n',
        'o',
        'p',
        'q',
        'r',
        's',
        't',
        'u',
        'v',
        'w',
        'x',
        'y',
        'z'
      ];
    
      List<Widget> alphabetCards = [
        AlphabetCard(),
        BAlphabetCard(),
        CAlphabetCard(),
        DAlphabetCard(),
        EAlphabetCard(),
      ];
      List<Widget> selectionCards = <Widget>[];
    
      @override
      void initState() {
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
            decoration: BoxDecoration(
                gradient: LinearGradient(
                    begin: Alignment.bottomLeft,
                    end: Alignment.topRight,
                    colors: [Colors.blueGrey[300], Colors.blueGrey])),
            padding: EdgeInsets.all(15),
            alignment: Alignment.center,
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 4,
                mainAxisSpacing: 10,
                crossAxisSpacing: 10,
              ),
              itemCount: alphabetCards.length,
              itemBuilder: (con, ind) {
                return InkWell(
                  onTap: () {
                    setState(() {
                      print("print ${alphabetCards[ind].toString()}");
                      if (selectionCards.contains(alphabetCards[ind]))
                        selectionCards.remove(alphabetCards[ind]);
                      else
                        selectionCards.add(alphabetCards[ind]);
                    });
                    print(selectionCards);
                  },
                  child: Container(
                      padding: EdgeInsets.all(10),
                      alignment: Alignment.center,
                      decoration: BoxDecoration(
                          color: selectionCards.contains(alphabetCards[ind])
                              ? Colors.orange
                              : Colors.white,
                          borderRadius: BorderRadius.circular(0)),
                      child: Text(alphabets[ind],
                          style: TextStyle(color: Colors.black, fontSize: 50))),
                );
              },
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.pushNamed(context, '/tabbedcards',
                  arguments: {'selectionOfCards': selectionCards});
            },
            backgroundColor: Colors.red,
          ),
        );
      }
    }
    
    class AlphabetCard extends StatelessWidget {
      const AlphabetCard({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text(" A hello"),
        );
      }
    }
    
    class BAlphabetCard extends StatelessWidget {
      const BAlphabetCard({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text(" B hello"),
        );
      }
    }
    
    class CAlphabetCard extends StatelessWidget {
      const CAlphabetCard({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text(" C hello"),
        );
      }
    }
    
    class DAlphabetCard extends StatelessWidget {
      const DAlphabetCard({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text(" D hello"),
        );
      }
    }
    
    class EAlphabetCard extends StatelessWidget {
      const EAlphabetCard({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text(" E hello"),
        );
      }
    }
    
    class TabbedCards extends StatefulWidget {
      @override
      _TabbedCardsState createState() => _TabbedCardsState();
    }
    
    class _TabbedCardsState extends State<TabbedCards> {
      Map<String, List> selectionOfCards;
      List<Widget> data;
    
      @override
      Widget build(BuildContext context) {
        selectionOfCards = ModalRoute.of(context).settings.arguments;
        data = selectionOfCards['selectionOfCards'];
        print(data.toString());
        return MaterialApp(
          home: DefaultTabController(
            length: data.length,
            child: Scaffold(
              body: TabBarView(
                children: data,
              ),
            ),
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      改变这个:

      List selectionCards
      

      进入这个:

      Map selectionCards
      

      您在此处检索的参数ModalRoute.of(context).settings.arguments 的类型为Map

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 2020-07-03
        • 2021-01-30
        • 2021-01-18
        • 1970-01-01
        • 2022-07-22
        • 2019-04-03
        • 2019-01-26
        • 2021-01-13
        相关资源
        最近更新 更多