Flattern So zeigen Sie die Liste nach for-Schleife an

Dec 01 2020

Ich habe eine einfache Liste erstellt, um sie nach for-Schleife anzuzeigen.

List categories = [
  {
    {
      'CatID': '0',
      'CatName': 'All'
    },
    {
      'CatID': '1',
      'CatName': 'Computer Hardware'
    },
    {
      'CatID': '2',
      'CatName': 'Computer Software'
    },
  }
];

dann definiere ich ein Widget wie dieses

List<Widget> CatWidget = List<Widget>(); 

Dann benutze ich es so

for (int i = 0; i < 8; i++) {
  CatWidget.add(
    Container(
      child: Text(categories[i]['CatName']),
    ),
  );
}

Es zeigt Fehler Class '_CompactLinkedHashSet<Map<String, String>>' has no instance method '[]'.

Antworten

3 nvoigt Dec 01 2020 at 15:51

Ihre Liste enthält zu viele Klammern:

List categories = [
    {
      'CatID': '0',
      'CatName': 'All'
    },
    {
      'CatID': '1',
      'CatName': 'Computer Hardware'
    },
    {
      'CatID': '2',
      'CatName': 'Computer Software'
    },
  ];

Und Ihre Schleife sollte laufen 3 nicht 8 , weil Sie nicht haben 8.

Folgendes würde also funktionieren. Ich empfehle Ihnen jedoch, die andere Antwort auf einen besseren Ansatz im Allgemeinen zu prüfen:

import 'package:flutter/material.dart';

void main() {

    List categories = [
  
    {
      'CatID': '0',
      'CatName': 'All'
    },
    {
      'CatID': '1',
      'CatName': 'Computer Hardware'
    },
    {
      'CatID': '2',
      'CatName': 'Computer Software'
    },
  ];

final catWidget = List<Widget>(); 

for (int i = 0; i < 3; i++) {
  catWidget.add(
    Container(
      child: Text(categories[i]['CatName']),
    ),
  );
}

  runApp(MyApp(catWidget));
}

class MyApp extends StatelessWidget {
  final List<Widget> children;
  
  const MyApp(this.children);
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(children: children),
        ),
     );
  }
}
3 UsmanAkhlaq Dec 01 2020 at 15:43

Mit list.generate können Sie Ihre Liste durchlaufen und ein Widget zurückgeben.

 Column(
            children: List.generate(
              tags.length,
              (index) => Container(
                // margin: EdgeInsets.symmetric(),
                child: NativeButton(
                  borderRadius: BorderRadius.circular(4),
                  padding: EdgeInsets.symmetric(
                    vertical: sizeConfig.height(.01),
                    horizontal: sizeConfig.width(.02),
                  ),
                  color: Colors.grey[200],
                  child: Text(tags[index]),
                ),
              ),
            ),
          ),
RohitSingh Dec 01 2020 at 16:03

Sie haben ein JSON-Array, innerhalb des JSON-Arrays haben Sie ein JSON-Objekt und innerhalb dieses JSON-Objekts haben Sie mehrere JSON-Objekte, die Sie einzeln iterieren möchten, was unangemessen ist.

JSON-Array> JSON-Objekte True

JSON-Array> JSON-Array> JSON-Objekt (e) True

JSON-Array> JSON-Objekt> JSON-Objekt (e) Falsch

Die For-Schleife kann nur für Arrays oder Objektlisten verwendet werden, und der JSON sollte wie folgt aussehen:

  [
    {
      'CatID': '0',
      'CatName': 'All'
    },
    {
      'CatID': '1',
      'CatName': 'Computer Hardware'
    },
    {
      'CatID': '2',
      'CatName': 'Computer Software'
    },
  ]