我有两页,一张是博物馆(home.dart)的名单,另一页是博物馆信息(museumPage.dart)。我不想为不同的博物馆创建不同的页面,所以我只创建了一个museumPage.dart.museumPage.dart可以使用Home.dart,传递博物馆的名称。Museum.dart通过知道musem的标题从JSON文件中获取博物馆的数据。博物馆的所有信息都保存在博物馆的班级里。
有问题吗?JSON比Widget的构建要慢,所以它首先构建没有任何内部任何内容的Widget,因为获取没有完成,对象Museo没有任何东西。
如果我回到museumPage.dart的Home.dart,然后去另一家博物馆(与前一家不同),museumPage.dart将展示前一家博物馆的信息。
有什么办法可以避免吗?我能不带急转弯去取东西吗?
资产/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)
...
}
}发布于 2021-01-29 15:38:31
一旦您从museumPage中导航出来,您可以使用dispose函数“清理”它。这应该在Widget build()之前或之后添加。
@override
void dispose() {
//You code to clean the page here
ex:
Museo=null;
}这应该能解决问题。
发布于 2021-01-29 15:47:22
当您从网络中获取东西时,您几乎总是会有某种网络延迟。您应该考虑使用FutureBuilder轻松地提供一个占位符,比如文本(‘取.’),直到数据被接收并去JSON化为止。没有办法把异步抓取变成同步..。例如,如果您有一个动画,并且必须有一些要显示的东西,那么您可能每秒调用该build()方法120次。
https://stackoverflow.com/questions/65957335
复制相似问题