无法再在颤振应用程序中加载 JSON 文件



我创建了一个语言学习应用程序,用户可以在其中选择语言中的各种主题(例如购物,闲聊,字母表,辅音等等)。当用户点击一个主题时,它将加载一个json文件。这款应用运行得很好,已经在应用商店上架了(它的名字叫Sankofa)。现在我想添加一种新的语言,并注意到我的Futurebuilder不再工作了,因此应用程序不会加载json文件。

我得到的错误是: 在构建FutureBuilder(dirty, state: _FutureBuilderState#a072a)时抛出如下_TypeError:类型'Null'不是类型'List'的子类型 下面是加载json文件的代码:
class Json extends StatelessWidget {
// accepting language as a parameter
String topicname;
late String assettoload;
Json(this.topicname);
setasset() {
if (topicname == "farben") {
assettoload = "assets/lerndateien/farben.json";
} else if (topicname == "Fragewörter") {
assettoload = "assets/lerndateien/fragewoerter.json";
} else if (topicname == "Begrüßungen") {
assettoload = "assets/lerndateien/saetze.json";
} else if (topicname == "Konsonanten") {
assettoload = "assets/lerndateien/konsonanten.json";
} else if (topicname == "Selbstlaute") {
assettoload = "assets/lerndateien/selbstlaute.json";
} else if (topicname == "Wochentage") {
assettoload = "assets/lerndateien/wochentage.json";
} else if (topicname == "Zeitangaben") {
assettoload = "assets/lerndateien/zeitangaben.json";
} else if (topicname == "Einkaufen") {
assettoload = "assets/lerndateien/einkaufen.json";
} else if (topicname == "Konversation") {
assettoload = "assets/lerndateien/konversation.json";
} else if (topicname == "Richtungen") {
assettoload = "assets/lerndateien/richtungsangaben.json";
} else if (topicname == "Über mich") {
assettoload = "assets/lerndateien/uebermich.json";
} else if (topicname == "Wegweisung") {
assettoload = "assets/lerndateien/wegweisungen.json";
} else if (topicname == "Lebensmittel") {
assettoload = "assets/lerndateien/lebensmittel.json";
} else if (topicname == "Tiere") {
assettoload = "assets/lerndateien/tiere.json";
}
}
@override
Widget build(BuildContext context) {
// function called before the build
// string assettoload is avialable to the DefaultAssetBuilder
setasset();
// return to the FutureBuilder to load and decode JSON
return FutureBuilder(
future:
DefaultAssetBundle.of(context).loadString(assettoload, cache: false),
builder: (context, snapshot) {
List mydata = json.decode(snapshot.data.toString());
if (mydata == null) {
return Scaffold(
body: Row(
children: [
BackButton(),
Center(
child: Text(
"Lädt...",
),
),
],
),
);
} else {
return quizpage(mydata: mydata);
}
},
);
}
}

我尝试了很多事情(如果mydata == true),但没有工作。我打赌这只是一个小问题,我希望有人能帮助我。

谢谢!

这是因为您试图访问快照data时,它还没有完成加载尚未(无论它将是null或不)通过使用toString()

在你的Builder中,你需要在加载的时候处理这个情况,之前你可以检查它是否加载了null

builder: (context, snapshot) {
// This will execute when it is finished loading AND is not null
if(snapshot.hasData){
List mydata = json.decode(snapshot.data.toString());
if (mydata == null) {
return Scaffold(
body: Row(
children: [
BackButton(),
Center(
child: Text(
"Lädt...",
),
),
],
),
);
} else {
return quizpage(mydata: mydata);
}
}
/* other handling, example */
return CircularProgressIndicator();
},
...

现在,正如您将在IDE中看到的,快照可以有多个ConnectionState。查看这里的一个像样的例子,如何处理其他状态。

相关内容

  • 没有找到相关文章

最新更新