Flutter 在没有异步的情况下从 json 中获取数据

时间:2021-01-29 15:31:40

标签: json flutter

我有两页,一页显示博物馆列表(home.dart),另一页显示博物馆信息(museumPage.dart)。 我不想为不同的博物馆创建不同的页面,所以我只创建了一个 museumPage.dartHome.dart 可以通过博物馆的名称进入museumPage.dartMuseum.dart 通过知道博物馆的标题从 JSON 文件中获取博物馆的数据。博物馆的所有信息都保存在博物馆课程中。

问题? JSON 比 Widget 的构建速度慢,因此它首先构建 Widget 内部没有任何内容,因为获取未完成并且对象 Museo 没有任何内容。

如果我从 museumPage.dart 回到 Home.dart 然后去另一个博物馆(与之前的不同),museumPage.dart 将显示以前的博物馆。

有没有办法避免这种情况?我可以在没有异步的情况下获取吗?

assets/loadjson/infomusei.json

{
    "museumName1" : {
            "prezzo" : "...",
        "luogo" : "...",
        "orario" : "...",
        "numero" : "...",
        "sito" : "...",
        "storia" : "...",
        "immagine" : "...",
  },
    "museumName2" : {
            "prezzo" : "...",
            "luogo" :"...",
            "orario" :"...",
            "numero" : "...",
            "sito" : "...",
            "storia" : "...",
            "immagine" : "...",
  }
}

main.dart

'''somewhere inside the code'''
onTap: (){
    Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => museumPage(museumName))
    );
}

museumPage.dart

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)
        ...
    }
}

2 个答案:

答案 0 :(得分:0)

一旦您离开博物馆页面,您就可以使用 dispose 函数来“清理”它。这应该在您的 Widget build() 之前或之后添加。

  @override
  void dispose() {
    //You code to clean the page here
    ex:
   Museo=null;
  }

这应该可以解决问题。

答案 1 :(得分:0)

当您从网络上获取东西时,您几乎总会遇到某种网络延迟。您应该考虑使用 FutureBuilder 轻松提供占位符,例如 Text('Fetching...'),直到您的数据被接收并取消 JSON 化。真的没有办法将异步获取转换为同步......例如,如果你有动画,你可能每秒调用 build() 方法 120 次,并且它必须有一些东西要显示。