首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不需要异步从json获取数据的颤振

不需要异步从json获取数据的颤振
EN

Stack Overflow用户
提问于 2021-01-29 15:31:40
回答 2查看 167关注 0票数 1

我有两页,一张是博物馆(home.dart)的名单,另一页是博物馆信息(museumPage.dart)。我不想为不同的博物馆创建不同的页面,所以我只创建了一个museumPage.dart.museumPage.dart可以使用Home.dart,传递博物馆的名称。Museum.dart通过知道musem的标题从JSON文件中获取博物馆的数据。博物馆的所有信息都保存在博物馆的班级里。

有问题吗?JSON比Widget的构建要慢,所以它首先构建没有任何内部任何内容的Widget,因为获取没有完成,对象Museo没有任何东西。

如果我回到museumPage.dartHome.dart,然后去另一家博物馆(与前一家不同),museumPage.dart将展示前一家博物馆的信息。

有什么办法可以避免吗?我能不带急转弯去取东西吗?

资产/loadjson/infomusei.json

代码语言:javascript
复制
{
    "museumName1" : {
            "prezzo" : "...",
        "luogo" : "...",
        "orario" : "...",
        "numero" : "...",
        "sito" : "...",
        "storia" : "...",
        "immagine" : "...",
  },
    "museumName2" : {
            "prezzo" : "...",
            "luogo" :"...",
            "orario" :"...",
            "numero" : "...",
            "sito" : "...",
            "storia" : "...",
            "immagine" : "...",
  }
}

main.dart

代码语言:javascript
复制
'''somewhere inside the code'''
onTap: (){
    Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => museumPage(museumName))
    );
}

museumPage.dart

代码语言:javascript
复制
Future<String> loadMuseumAsset() async {
  return await rootBundle.loadString('assets/loadjson/infomusei.json');
}

Future loadMuseum(String nome) async {
  String jsonString = await loadMuseumAsset();
  final jsonResponse = json.decode(jsonString);
  Museo = new museo.fromJson(jsonResponse, nome);
}

class museo{
  String nome;
  String prezzo;
  String luogo;
  String orario;
  String numero;
  String sito;
  String storia;
  String immagine;

  museo({this.prezzo, this.luogo, this.orario, this.numero, this.sito, this.storia, this.immagine});

  factory museo.fromJson(Map<String, dynamic> parsedJson, String nome){
    return museo(
        prezzo: parsedJson[nome]['prezzo'],
        luogo: parsedJson[nome]['luogo'],
        orario: parsedJson[nome]['orario'],
        numero: parsedJson[nome]['numero'],
        sito: parsedJson[nome]['sito'],
        storia: parsedJson[nome]['storia'],
        immagine: parsedJson[nome]['immagine'],
    );
  }
}

museo Museo;

class museumPage extends StatelessWidget{
    museumPage(String title){
            loadMuseum(title);
    }

    Widget buid(...){
        ...
        print(Museo.prezzo)
        ...
    }
}
EN

回答 2

Stack Overflow用户

发布于 2021-01-29 15:38:31

一旦您从museumPage中导航出来,您可以使用dispose函数“清理”它。这应该在Widget build()之前或之后添加。

代码语言:javascript
复制
  @override
  void dispose() {
    //You code to clean the page here
    ex:
   Museo=null;
  }

这应该能解决问题。

票数 0
EN

Stack Overflow用户

发布于 2021-01-29 15:47:22

当您从网络中获取东西时,您几乎总是会有某种网络延迟。您应该考虑使用FutureBuilder轻松地提供一个占位符,比如文本(‘取.’),直到数据被接收并去JSON化为止。没有办法把异步抓取变成同步..。例如,如果您有一个动画,并且必须有一些要显示的东西,那么您可能每秒调用该build()方法120次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65957335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档