Dart 如何改变未来<;列表<;地图>;列出<;地图>;用飞镖的语言?

Dart 如何改变未来<;列表<;地图>;列出<;地图>;用飞镖的语言?,dart,flutter,Dart,Flutter,我对用dart语言编码有一个问题。如何将未来转换为正常列表?在我的程序中,我需要web的结果来继续下一步,但我不知道怎么做。 在我的例子中,我需要以列表的形式返回变量“data”的值 class _MyAppState extends State<MyApp> { static List getList() { var url = "http://watcherman.cn/web/json.php"; var data; HttpClient cli

我对用dart语言编码有一个问题。如何将未来转换为正常列表?在我的程序中,我需要web的结果来继续下一步,但我不知道怎么做。 在我的例子中,我需要以列表的形式返回变量“data”的值

class _MyAppState extends State<MyApp> {
    static List getList() {
    var url = "http://watcherman.cn/web/json.php";
    var data;
    HttpClient client = new HttpClient();
    client.getUrl(Uri.parse(url))
      .then((HttpClientRequest request) => request.close())
    .then((HttpClientResponse response) {
      response.transform(UTF8.decoder).listen((contents) {
        String jsonContent = contents.toString();
        data = JSON.decode(jsonContent);
      });
    });
    return data;
  }
}
class\u MyAppState扩展状态{
静态列表getList(){
变量url=”http://watcherman.cn/web/json.php";
var数据;
HttpClient=新的HttpClient();
client.getUrl(Uri.parse(url))
.然后((HttpClientRequest请求)=>request.close())
.然后((HttpClientResponse响应){
response.transform(UTF8.decoder).listen((内容){
字符串jsonContent=contents.toString();
data=JSON.decode(jsonContent);
});
});
返回数据;
}
}
但似乎没有执行网络部分。 颤振代码部分似乎无法接受未来

class _MyAppState extends State<MyApp> {
  static List content = getList();
  @override
  Widget build(BuildContext context) {
    return new Container(
        child: new ListView.builder(
            scrollDirection: Axis.vertical,
            padding: new EdgeInsets.all(6.0),
            itemCount: content.length,
            itemBuilder: (BuildContext context, int index) {
              return new Container(
                  alignment: FractionalOffset.center,
                  margin: new EdgeInsets.only(bottom: 6.0),
                  padding: new EdgeInsets.all(6.0),
                  color: Colors.blueGrey,
                  child: new Text(content[index]["title"])
              );
            }
        )
    );
  }
}
class\u MyAppState扩展状态{
静态列表内容=getList();
@凌驾
小部件构建(构建上下文){
退回新货柜(
子项:新建ListView.builder(
滚动方向:轴垂直,
填充:新边缘设置。全部(6.0),
itemCount:content.length,
itemBuilder:(构建上下文,int索引){
退回新货柜(
对齐:分馏loffset.center,
边距:仅限新边集(底部:6.0),
填充:新边缘设置。全部(6.0),
颜色:颜色。蓝灰色,
子项:新文本(内容[索引][“标题”])
);
}
)
);
}
}

您应该重写
getList
方法以返回一个。可以通过一系列调用来实现这一点,但使用起来更具可读性

一旦有了一个返回
未来
的方法,就可以根据异步计算的结果来构建树

导入“包装:颤振/材料.省道”;
导入“dart:io”;
导入“dart:convert”;
导入“dart:async”;
void main(){
runApp(新材料)PP(
主页:新建MyApp(),
));
}
类MyApp扩展了StatefulWidget{
State createState()=>new_MyAppState();
}
类MyAppState扩展了状态{
静态未来getList()异步{
变量url=”http://watcherman.cn/web/json.php";
HttpClient=新的HttpClient();
HttpClientRequest=wait client.getUrl(Uri.parse(url));
HttpClientResponse response=等待请求。关闭();
返回response.transform(UTF8.decoder).transform(JSON.decoder.toList();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“期货演示”),
),
身体:新未来建设者(
future:getList(),
生成器:(BuildContext上下文,异步快照){
如果(!snapshot.hasData)
返回新容器();
列表内容=快照.数据[0];
返回新的ListView.builder(
滚动方向:轴垂直,
填充:新边缘设置。全部(6.0),
itemCount:content.length,
itemBuilder:(构建上下文,int索引){
退回新货柜(
对齐:分馏loffset.center,
边距:仅限新边集(底部:6.0),
填充:新边缘设置。全部(6.0),
颜色:颜色。蓝灰色,
子项:新文本(“${content[index]['title']}”),
);
},
);
}
)
);
}
}

您无法摆脱异步

在Dart中,函数要么返回值,要么返回未来值。当结果还没有准备好时,它返回一个future。当函数返回时,它将只在以后的时间可用

这意味着,如果你所拥有的只是一个
未来
,而你现在就想要这个值,因为这个值还不存在,那么你就会陷入困境。您现在不能返回
列表
,因为
未来
现在没有列表,它只在以后才有

因此,您必须等待未来,
var data=wait client.getUrl(…)…
,这意味着您的函数也必须是异步的。 因此,让
getList
函数返回一个
Future
而不是
List
,因为这就是它所能做的

Dart不支持的另一种方法是阻塞操作,它停止执行,直到有值可用,然后继续正常执行。这在单线程语言(如Dart和JavaScript,Dart必须编译到这些语言)中是一个问题,因为阻塞意味着什么也不发生,UI变得无响应


因此,如果您的结果取决于未来的值,那么您的函数也必须是异步的,并作为未来返回自己的结果。

谢谢!我在编程时意识到了这一点,但不知道如何解决它。最好的答案可以完美地解决这个问题。我不能实现我的目标的原因是对颤振知识的缺陷。不过还是要谢谢你!是的,这是正确的解决方案。如何在网络请求发生时显示刷新指示器?构建中文新闻应用程序?
import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:convert';
import 'dart:async';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  State createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {

  static Future<List> getList() async {
    var url = "http://watcherman.cn/web/json.php";
    HttpClient client = new HttpClient();
    HttpClientRequest request = await client.getUrl(Uri.parse(url));
    HttpClientResponse response = await request.close();
    return response.transform(UTF8.decoder).transform(JSON.decoder).toList();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Futures Demo'),
      ),
      body: new FutureBuilder(
        future: getList(),
        builder: (BuildContext context, AsyncSnapshot<List> snapshot) {
          if (!snapshot.hasData)
            return new Container();
          List content = snapshot.data[0];
          return new ListView.builder(
            scrollDirection: Axis.vertical,
            padding: new EdgeInsets.all(6.0),
            itemCount: content.length,
            itemBuilder: (BuildContext context, int index) {
              return new Container(
                alignment: FractionalOffset.center,
                margin: new EdgeInsets.only(bottom: 6.0),
                padding: new EdgeInsets.all(6.0),
                color: Colors.blueGrey,
                child: new Text('${content[index]['title']}'),
              );
            },
          );
        }
      )
    );
  }
}