Home > Net >  Flutter: Call a method from a class based on properties
Flutter: Call a method from a class based on properties

Time:10-27

The objective is to use the properties of a parent class to call a method and extend the content of that class.

The following code is designed to call a method based on the property of it's parent class. It returns a type error.

It is called like this:

MyToolbar(data: [
  {
    'MySecondClass': ['red','green','purple']
  }
])

And this is the class:

    class MyToolbar extends StatelessWidget {
      MyToolbar({required this.data})
      final List data;

      ToolbarContent(type, data) {
        if (type == 'MySecondClass') {
          return MySecondClass(toggles: data);
      }

      @override
      Widget build(BuildContext context) {
        return Stack(children:[
          for (List childData in data)
          ToolbarContent('mySecondClass', childData),
    
    ])}

Firstly this returns the following type error.

_TypeError (type '_InternalLinkedHashMap<String, List<String>>' is not a subtype of type 'List<dynamic>')

Secondly, the list needs to find the key of the property data in order to set the correct function name for the function 'ToolbarContent'.

CodePudding user response:

There's a few issues here. First, as mentioned by temp_, you need to set the List type for data, in this case would be List<Map<String,List<String>>

Second would be that for (List childData in data) needs to be actually for (Map<String,List<String>> childData in data)

The third is an assumption, but I think that there's a typo in your for loop where mySecondClass should be MySecondClass (or the other way)

The correct code would be as follows:

class MyToolbar extends StatelessWidget {
  final List<Map<String, List<String>>> data;

  MyToolbar({required this.data});

  @override
  Widget build(BuildContext context) {
    var children = <Widget>[];
    data.forEach((childData) {
      childData.forEach((key, stringList) {
        //I'm assuming Toolbar content takes the key of the map i.e. MySecondClass
        //as the first param and the List for the key as the second param
        children.add(ToolbarContent(key, stringList));
      });
    });
    return Stack(
      children: children,
    );
  }
}

Note: I'm also assuming that the ToolbarContent is another class, but do let me know if otherwise.

CodePudding user response:

By default Dart sets any List to List<dynamic>. This is what the error is saying. You need to cast your List, try this instead final List<Map<String, List<String>> data;

  • Related