Mam fragment kodu, który skopiowałem z przykładu 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(),
);
},
);
}
Ale otrzymuję ten błąd
type 'List<dynamic>' is not a subtype of type 'List<Widget>'
Co się tutaj dzieje?
firebase
flutter
dart
google-cloud-firestore
Wysypka
źródło
źródło
List<ListTile>
parzysta bez określania gomap
.Możesz przesłać listę dynamiczną do listy o określonym typie:
List<'YourModel'>.from(_list.where((i) => i.flag == true));
źródło
Rozwiązałem swój problem, przechodząc
Map
naWidget
źródło
Myślę, że używasz _buildBody we właściwościach dzieci niektórych widżetów, więc dzieci oczekują Widgetu List (tablicy Widgetów), a _buildBody zwraca 'Dynamiczną Listę' .
W bardzo prosty sposób możesz użyć zmiennej, aby ją zwrócić:
// 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 )
Przykład ( flutter create test1 ; cd test1 ; edit 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 ) ) ); } }
Inny przykład użycia widżetu (oneWidget) w ramach listy widżetów (arrayOfWidgets). Pokazuję, jak rozszerza widżet (MyButton), aby spersonalizować widżet i zmniejszyć rozmiar kodu:
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'.");}, ); } }
Zrobiłem kompletny przykład , że używam dynamicznych widżetów do pokazywania i ukrywania widżetów na ekranie, możesz też zobaczyć, jak działa online na skrzypcach dart .
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()); } }
Może to komuś pomoże. Jeśli to Ci się przydało, daj mi znać, klikając strzałkę w górę. Dzięki.
https://dartpad.dev/b37b08cc25e0ccdba680090e9ef4b3c1
źródło
Text('My Buttons')
DoList<Widget>
tablicy. DostaćThe element type 'Text' can't be assigned to the list type 'Widget'
. Jakie byłoby obejście tego problemu?To działa dla mnie
List<'YourModel'>.from(_list.where((i) => i.flag == true));
źródło
Aby przekonwertować każdy element na widget, użyj konstruktora ListView.builder ().
Ogólnie rzecz biorąc, zapewnij funkcję konstruktora, która sprawdza, z jakim typem przedmiotu masz do czynienia i zwraca odpowiedni widżet dla tego typu przedmiotu.
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), ); }, );
źródło