Ich habe einen Codeausschnitt, den ich aus dem Firestore-Beispiel kopiert habe:
Widget _buildBody(BuildContext context) {
return new StreamBuilder(
stream: _getEventStream(),
builder: (context, snapshot) {
if (!snapshot.hasData) return new Text('Loading...');
return new ListView(
children: snapshot.data.documents.map((document) {
return new ListTile(
title: new Text(document['name']),
subtitle: new Text("Class"),
);
}).toList(),
);
},
);
}
Aber ich bekomme diesen Fehler
type 'List<dynamic>' is not a subtype of type 'List<Widget>'
Was geht hier schief?
List<ListTile>
gerade abgeleitet wird, ohne ihn anzugebenmap
.Sie können dynamische Liste in Liste mit einem bestimmten Typ umwandeln:
List<'YourModel'>.from(_list.where((i) => i.flag == true));
quelle
Ich habe mein Problem durch Konvertieren
Map
in gelöstWidget
quelle
Ich denke , dass Sie _buildBody in den verwenden Kinder Eigenschaften einiger widget, so Kinder eine erwarten Liste Widget (array of Widget) und _buildBody eine zurückgibt ‚Liste dynamisch‘ .
Auf sehr einfache Weise können Sie eine Variable verwenden, um sie zurückzugeben:
// you can build your List of Widget's like you need List<Widget> widgets = [ Text('Line 1'), Text('Line 2'), Text('Line 3'), ]; // you can use it like this Column( children: widgets )
Beispiel ( flatter create test1 ; cd test1 ; edit lib / main.dart ; flatter run ):
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { List<Widget> widgets = [ Text('Line 1'), Text('Line 2'), Text('Line 3'), ]; Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text("List of Widgets Example")), body: Column( children: widgets ) ) ); } }
Ein weiteres Beispiel unter Verwendung eines Widget (oneWidget) innerhalb einer Liste der Widgets (arrayOfWidgets). Ich zeige, wie weit ein Widget (MyButton) reicht, um ein Widget zu personalisieren und die Größe des Codes zu reduzieren:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { List<Widget> arrayOfWidgets = [ Text('My Buttons'), MyButton('Button 1'), MyButton('Button 2'), MyButton('Button 3'), ]; Widget oneWidget(List<Widget> _lw) { return Column(children: _lw); } Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text("Widget with a List of Widget's Example")), body: oneWidget(arrayOfWidgets) ) ); } } class MyButton extends StatelessWidget { final String text; MyButton(this.text); @override Widget build(BuildContext context) { return FlatButton( color: Colors.red, child: Text(text), onPressed: (){print("Pressed button '$text'.");}, ); } }
Ich habe ein vollständiges Beispiel erstellt , in dem ich dynamische Widgets verwende , um Widgets auf dem Bildschirm anzuzeigen und auszublenden. Sie können sehen, dass sie auch online auf Dart Fiddle ausgeführt werden.
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { List item = [ {"title": "Button One", "color": 50}, {"title": "Button Two", "color": 100}, {"title": "Button Three", "color": 200}, {"title": "No show", "color": 0, "hide": '1'}, ]; Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text("Dynamic Widget - List<Widget>"),backgroundColor: Colors.blue), body: Column( children: <Widget>[ Center(child: buttonBar()), Text('Click the buttons to hide it'), ] ) ) ); } Widget buttonBar() { return Column( children: item.where((e) => e['hide'] != '1').map<Widget>((document) { return new FlatButton( child: new Text(document['title']), color: Color.fromARGB(document['color'], 0, 100, 0), onPressed: () { setState(() { print("click on ${document['title']} lets hide it"); final tile = item.firstWhere((e) => e['title'] == document['title']); tile['hide'] = '1'; }); }, ); } ).toList()); } }
Vielleicht hilft es jemandem. Wenn es für Sie nützlich war, lassen Sie mich bitte wissen, indem Sie auf den Aufwärtspfeil klicken. Vielen Dank.
https://dartpad.dev/b37b08cc25e0ccdba680090e9ef4b3c1
quelle
Text('My Buttons')
in dasList<Widget>
Array zuweisen . ErhaltenThe element type 'Text' can't be assigned to the list type 'Widget'
. Was wäre eine Problemumgehung dafür?Das funktioniert bei mir
List<'YourModel'>.from(_list.where((i) => i.flag == true));
quelle
Verwenden Sie den Konstruktor ListView.builder (), um jedes Element in ein Widget zu konvertieren.
Stellen Sie im Allgemeinen eine Builder-Funktion bereit, die prüft, um welchen Elementtyp es sich handelt, und das entsprechende Widget für diesen Elementtyp zurückgibt.
ListView.builder( // Let the ListView know how many items it needs to build. itemCount: items.length, // Provide a builder function. This is where the magic happens. // Convert each item into a widget based on the type of item it is. itemBuilder: (context, index) { final item = items[index]; return ListTile( title: item.buildTitle(context), subtitle: item.buildSubtitle(context), ); }, );
quelle