Tengo un fragmento de código que copié del ejemplo de Firestore:
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(),
);
},
);
}
Pero me sale este error
type 'List<dynamic>' is not a subtype of type 'List<Widget>'
¿Qué sale mal aquí?
List<ListTile>
par sin especificarlomap
.Puede convertir una lista dinámica en una lista con un tipo específico:
List<'YourModel'>.from(_list.where((i) => i.flag == true));
fuente
He resuelto mi problema convirtiéndome
Map
enWidget
fuente
Creo que utilice _buildBody en los niños propiedades de algunos widgets, por lo que los niños esperan un widget Lista (variedad de widgets) y _buildBody devuelve una 'lista dinámica' .
De una manera muy simple, puedes usar una variable para devolverla:
// 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 )
Ejemplo ( flutter crea test1 ; cd test1 ; edita lib / main.dart ; flutter 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 ) ) ); } }
Otro ejemplo usando un widget (oneWidget) dentro de una lista de widgets (arrayOfWidgets). Muestro cómo se extiende un widget (MyButton) para personalizar un widget y reducir el tamaño del código:
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'.");}, ); } }
Hice un ejemplo completo de que uso widgets dinámicos para mostrar y ocultar widgets en la pantalla, también puede verlo ejecutándose en línea en el violín de dardos .
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()); } }
Quizás ayude a alguien. Si fue útil para usted, hágamelo saber haciendo clic en la flecha hacia arriba, por favor. Gracias.
https://dartpad.dev/b37b08cc25e0ccdba680090e9ef4b3c1
fuente
Text('My Buttons')
a laList<Widget>
matriz. ConseguirThe element type 'Text' can't be assigned to the list type 'Widget'
. ¿Cuál sería una solución para esto?Esto funciona para mi
List<'YourModel'>.from(_list.where((i) => i.flag == true));
fuente
Para convertir cada elemento en un widget, use el constructor ListView.builder ().
En general, proporcione una función de generador que verifique el tipo de elemento con el que está tratando y devuelva el widget apropiado para ese tipo de elemento.
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), ); }, );
fuente