Flutter - Future<List<Widget>> 在 FutureBuilder 上
Flutter - Future<List<Widget>> on FutureBuilder
下面我把我写的一段代码简化一下。
我已经删除了一部分 tool() 函数,因为它对于这个问题的目的并不重要。
我希望 List OutputRow 显示为 FutureBuilder 中 Wrap() 的子项。
目前它给我这个错误:type 'List ' is not a subtype of type 'List '.
有人知道我该如何解决吗?
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,
);
}
}),
),
);
}
}
希望清楚。
谢谢:)
您面临的问题是您的函数 tool
正在 returning 一个 Future<List>
。当未定义 List
泛型 (List<>
) 时,它被解释为 dynamic
.
return Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
runSpacing: 4.0,
children: snapshot.data,
);
此处 children
需要小部件列表或换句话说 - List<Widget>
。
要解决此问题,请先将 tool
函数的 return 类型更改为:
Future<List<Widget>> tool(String text) async {
然后OutputRow
的声明为:
List<Widget> OutputRow = [];
结论:如果在提供时需要特定类型的列表,您应该声明列表的通用性以匹配请求的列表。
下面我把我写的一段代码简化一下。 我已经删除了一部分 tool() 函数,因为它对于这个问题的目的并不重要。
我希望 List OutputRow 显示为 FutureBuilder 中 Wrap() 的子项。
目前它给我这个错误:type 'List ' is not a subtype of type 'List '.
有人知道我该如何解决吗?
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,
);
}
}),
),
);
}
}
希望清楚。
谢谢:)
您面临的问题是您的函数 tool
正在 returning 一个 Future<List>
。当未定义 List
泛型 (List<>
) 时,它被解释为 dynamic
.
return Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
runSpacing: 4.0,
children: snapshot.data,
);
此处 children
需要小部件列表或换句话说 - List<Widget>
。
要解决此问题,请先将 tool
函数的 return 类型更改为:
Future<List<Widget>> tool(String text) async {
然后OutputRow
的声明为:
List<Widget> OutputRow = [];
结论:如果在提供时需要特定类型的列表,您应该声明列表的通用性以匹配请求的列表。