У меня есть фрагмент кода, который я скопировал из примера 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(),
);
},
);
}
Но я получаю эту ошибку
type 'List<dynamic>' is not a subtype of type 'List<Widget>'
Что здесь не так?
List<ListTile>
даже без указания егоmap
.Вы можете преобразовать динамический список в список с определенным типом:
List<'YourModel'>.from(_list.where((i) => i.flag == true));
источник
Я решил свою проблему, перейдя
Map
наWidget
источник
Я думаю, что вы используете _buildBody в дочерних свойствах некоторого виджета, поэтому дети ожидают виджет списка (массив виджетов), а _buildBody возвращает «динамический список» .
Очень просто вы можете использовать переменную для его возврата:
// 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 )
Пример ( 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 ) ) ); } }
Другой пример использования виджета (oneWidget) в списке виджетов (arrayOfWidgets). Я показываю, как расширяется виджет (MyButton) для персонализации виджета и уменьшения размера кода:
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'.");}, ); } }
Я сделал полный пример того, что использую динамические виджеты для отображения и скрытия виджетов на экране, вы также можете увидеть, как он работает онлайн на скрипке 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()); } }
Может кому поможет. Если он был вам полезен, дайте мне знать, нажав стрелку вверх, пожалуйста. Благодарю.
https://dartpad.dev/b37b08cc25e0ccdba680090e9ef4b3c1
источник
Text('My Buttons')
вList<Widget>
массив. ПолучениеThe element type 'Text' can't be assigned to the list type 'Widget'
. Что можно было бы исправить?Это работает для меня
List<'YourModel'>.from(_list.where((i) => i.flag == true));
источник
Чтобы преобразовать каждый элемент в виджет, используйте конструктор ListView.builder ().
В общем, предоставьте функцию построения, которая проверяет, с каким типом элемента вы имеете дело, и возвращает соответствующий виджет для этого типа элемента.
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), ); }, );
источник