Flutter 什么是未来?我如何使用它?
我得到以下错误:Flutter 什么是未来?我如何使用它?,flutter,dart,async-await,future,flutter-futurebuilder,async,await,Flutter,Dart,Async Await,Future,Flutter Futurebuilder,Async,Await,我得到以下错误: 无法将“Future”类型的值分配给“int”类型的变量 它可能是另一种类型,而不是int,但基本上模式是 无法将“Future”类型的值分配给“t”类型的变量 所以 什么是未来 如何获得我想要的实际值 当我只有一个未来时,我使用什么小部件来显示我的价值 如果您熟悉or和异步/等待模式,那么您可以直接跳到“如何使用flatter中的小部件使用未来”部分 什么是未来?我如何使用它? 那么,报告说, 表示延迟计算的对象 这是正确的。它也有点抽象和枯燥。通常,函数返回一个结果。
无法将“Future”类型的值分配给“int”类型的变量
它可能是另一种类型,而不是int
,但基本上模式是
无法将“Future”类型的值分配给“t”类型的变量
所以
- 什么是未来
- 如何获得我想要的实际值
- 当我只有一个
时,我使用什么小部件来显示我的价值未来
异步
/等待
模式,那么您可以直接跳到“如何使用flatter中的小部件使用未来”部分
什么是未来?我如何使用它?
那么,报告说,
表示延迟计算的对象
这是正确的。它也有点抽象和枯燥。通常,函数返回一个结果。按顺序。函数被调用、运行并返回其结果。在此之前,调用方将等待。有些功能,特别是当它们访问硬件或网络等资源时,需要花费一点时间。想象一下,从web服务器加载化身图片,从数据库加载用户数据,或者从设备内存加载多种语言的应用程序文本。那可能很慢
默认情况下,大多数应用程序只有一个控制流。当这个流被阻塞时,例如等待一个需要时间的计算或资源访问,应用程序就会冻结。如果你已经足够大了,你可能会记得这是一个标准,但在当今世界,这将被视为一个bug。即使有些事情需要时间,我们也会有一点活力。旋转器,沙漏,或者进度条。但是,应用程序如何运行并显示动画,而仍然等待结果呢?答案是:异步操作。代码等待时仍在运行的操作。现在,编译器如何知道它是应该停止所有操作并等待结果,还是继续所有后台工作并仅在此实例中等待?好吧,它自己无法弄清楚。我们必须告诉它
这是通过称为and的模式实现的。它不是特定于或,它在许多其他语言中以相同的名称存在。您可以找到Dart的文档
由于需要一段时间的方法不能立即返回,因此它将在完成时返回传递值的承诺
这就是所谓的未来。因此,从数据库加载数字的承诺将返回未来
,而从互联网搜索返回电影列表的承诺可能返回未来
。一个未来
是一个未来会给你一个T
的东西
让我们尝试另一种解释:
future表示异步操作的结果,可以有两种状态:未完成或已完成
最有可能的情况是,由于您这样做不仅仅是为了好玩,您实际上需要未来的结果才能在应用程序中取得进展。您需要显示数据库中的编号或找到的电影列表。所以你要等待,直到结果出现。这就是wait
的作用:
Future<List<Movie>> result = loadMoviesFromSearch(input);
// right here, you need the result. So you wait for it:
List<Movie> movies = await result;
我们的getPizza函数必须等待pizza,因此它不是立即返回pizza
,而是返回未来将有一个pizza的承诺。现在,您可以依次在某处等待getPizza函数
如何在flatter中使用未来的小部件?
Flatter中的所有小部件都期望实际值。而不是承诺以后会有价值。当按钮需要文本时,它不能使用文本稍后会出现的承诺。现在需要显示按钮,所以现在需要文本
但有时,你所拥有的只是一个未来。这就是问题所在。当你有未来时,你可以使用它,在你等待它的时候显示一件事(例如进度指示器),在它完成的时候显示另一件事(例如结果)
让我们看一下我们的比萨饼示例。您想要订购比萨饼,在等待比萨饼时想要一个进度指示器,您想要在比萨饼交付后看到结果,并且可能在出现错误时显示错误消息:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
/// ordering a pizza takes 5 seconds and then gives you a pizza salami with extra cheese
Future<String> orderPizza() {
return Future<String>.delayed(Duration(seconds: 5), () async => 'Pizza Salami, Extra Cheese');
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark(),
home: Scaffold(
body: Center(
child: PizzaOrder(),
),
),
);
}
}
class PizzaOrder extends StatefulWidget {
@override
_PizzaOrderState createState() => _PizzaOrderState();
}
class _PizzaOrderState extends State<PizzaOrder> {
Future<String> delivery;
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
RaisedButton(
onPressed: delivery != null ? null : () => setState(() { delivery = orderPizza(); }),
child: Text('Order Pizza Now')
),
delivery == null
? Text('No delivery scheduled')
: FutureBuilder(
future: delivery,
builder: (context, snapshot) {
if(snapshot.hasData) {
return Text('Delivery done: ${snapshot.data}');
} else if(snapshot.hasError) {
return Text('Delivery error: ${snapshot.error.toString()}');
} else {
return CircularProgressIndicator();
}
})
]);
}
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
///点一份比萨需要5秒钟的时间,然后给你一份比萨意大利腊肠加上额外的奶酪
未来订单(){
return Future.delayed(持续时间(秒:5),()异步=>“比萨沙拉,额外的奶酪”);
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark(),
家:脚手架(
正文:中(
child:PizzaOrder(),
),
),
);
}
}
类PizzaOrder扩展StatefulWidget{
@凌驾
_PizzaOrderState createState()=>\u PizzaOrderState();
}
类PizzaOrderState扩展状态{
未来交付;
@凌驾
小部件构建(构建上下文){
返回列(
crossAxisAlignment:crossAxisAlignment.center,
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
升起的按钮(
onPressed:delivery!=null?null:()=>setState((){delivery=orderPizza();}),
子项:文本('Order Pizza Now')
),
传递==null
?文本(“未安排交付”)
:未来建设者(
未来:交付,
生成器:(上下文,快照){
if(snapshot.hasData){
返回文本('Delivery done:${snapshot.data}');
}else if(snapshot.hasrerror){
返回文本('传递错误:${snapshot.error.toString()}');
}否则{
返回循环ProgressIndicator();
}
})
]);
}
}
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
/// ordering a pizza takes 5 seconds and then gives you a pizza salami with extra cheese
Future<String> orderPizza() {
return Future<String>.delayed(Duration(seconds: 5), () async => 'Pizza Salami, Extra Cheese');
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark(),
home: Scaffold(
body: Center(
child: PizzaOrder(),
),
),
);
}
}
class PizzaOrder extends StatefulWidget {
@override
_PizzaOrderState createState() => _PizzaOrderState();
}
class _PizzaOrderState extends State<PizzaOrder> {
Future<String> delivery;
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
RaisedButton(
onPressed: delivery != null ? null : () => setState(() { delivery = orderPizza(); }),
child: Text('Order Pizza Now')
),
delivery == null
? Text('No delivery scheduled')
: FutureBuilder(
future: delivery,
builder: (context, snapshot) {
if(snapshot.hasData) {
return Text('Delivery done: ${snapshot.data}');
} else if(snapshot.hasError) {
return Text('Delivery error: ${snapshot.error.toString()}');
} else {
return CircularProgressIndicator();
}
})
]);
}
}
Future<int> getValue() async {
return Future.value(5);
}
Future<int> value = await getValue(); // Not Allowed
// Error
A value of type 'Future<int>' can't be assigned to a variable of type 'int'
int value = await getValue(); // right way as it returning the potential value.