GOOGLE ADS

Freitag, 15. April 2022

Flutter - Future<List<Widget>> auf FutureBuilder

Unten habe ich eine Vereinfachung eines Codes eingefügt, den ich geschrieben habe. Ich habe einen Teil der Funktion tool() entfernt, da sie für den Zweck dieser Frage nicht wichtig ist.

Ich möchte, dass die List OutputRow als untergeordnete Elemente von Wrap() im FutureBuilder angezeigt wird.

Derzeit gibt es mir diesen Fehler: Typ 'List' ist kein Untertyp des Typs 'List'.

Weiß jemand wie ich das beheben kann?

import 'package:flutter/material.dart';
import 'package:language_tool/language_tool.dart';
void main() => runApp(mainApp());
class mainApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Chat(),
);
}
}
class Chat extends StatefulWidget {
const Chat({Key? key}): super(key: key);
@override
_ChatState createState() => _ChatState();
}
class _ChatState extends State<Chat> {
String text = 'Henlo. I am Gabriele. I am 21 yers old!';
Future<List> tool(String text) async {
var tool = LanguageTool();
var result = tool.check(text);
var correction = await result;
// code simplification {...}
List OutputList = [
'',
'Henlo',
'. I am Gabriele. I am 21 ',
'yers',
' old!'
];
List OutputBool = [false, true, false, true, false];
List OutputIndex = [0, 1, 2, 3, 4];
List OutputRow = [];
for (int i in OutputIndex) {
if (OutputBool[i] == false) {
OutputRow.add(
Container(
child: Text(
OutputList[i],
style: TextStyle(fontSize: 18.0),
),
),
);
} else if (OutputBool[i] == true) {
OutputRow.add(
Container(
child: GestureDetector(
onTap: () {},
child: Container(
color: Colors.orange,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
OutputList[i],
style: TextStyle(fontSize: 18.0),
),
),
),
),
),
);
}
}
print(OutputRow);
return OutputRow;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: FutureBuilder(
future: tool(text),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data == null) {
return Center(
child: Text('Loading...'),
);
} else {
return Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
runSpacing: 4.0,
children: snapshot.data,
);
}
}),
),
);
}
}

Ich hoffe, es ist klar.

Vielen Dank:)


Lösung des Problems

Das Problem, mit dem Sie konfrontiert sind, besteht darin, dass Ihre Funktion tooleine Future<List>. Wenn das Listgenerische ( List<>) nicht definiert ist, wird es als interpretiert dynamic.

return Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
runSpacing: 4.0,
children: snapshot.data,
);

Hier childrenerwartet Sie eine Liste von Widgets oder mit anderen Worten - List<Widget>.

Um das Problem zu beheben, ändern Sie zuerst den Rückgabetyp Ihrer toolFunktion in:

Future<List<Widget>> tool(String text) async {

Dann die Erklärung des OutputRowan:

 List<Widget> OutputRow = [];

Abschließend: Wenn bei der Bereitstellung ein bestimmter Listentyp erwartet wird, sollten Sie das Generikum der Liste so deklarieren, dass es mit dem angeforderten übereinstimmt.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...