我有两页,一页显示博物馆列表(home.dart),另一页显示博物馆信息(museumPage.dart)。 我不想为不同的博物馆创建不同的页面,所以我只创建了一个 museumPage.dart。 Home.dart 可以通过博物馆的名称进入museumPage.dart。 Museum.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)
...
}
}
答案 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 次,并且它必须有一些东西要显示。