logo_image我有一個用例,我必須根據json 檔案中的鍵值加載資產影像。
所以我有這個帶有鍵logo_image和值的json image1.png:
{
"logo_image" : "image1.png"
}
資產檔案夾中有一個影像,如下所示:assets/image1.png
我有一個類呼叫GetAssets(),其中一個呼叫getAssetItems()加載 json 檔案的方法和另一個呼叫方法getLogo,我將在視圖中用作藍圖來指定我要查看的關鍵項:
class GetAssets {
Future<Map<String, dynamic>> getAssetItems() async {
String jsonData =
await rootBundle.loadString('assets/items.json');
Map<String, dynamic> data = jsonDecode(jsonData);
return data;
Future getLogo(String key) async {
var assets = await GetAssets().getAssetItems();
return 'assets/' assets[key];
}
}
我有一個名為的欄位logo,我有一個呼叫方法setAssets()來加載徽標并設定徽標的狀態,setState()我用它initState()來初始化setAssets()。我有一個Scaffold()用于查看帶有該欄位的資產徽標logo:
import 'package:flutter/material.dart';
class ShowLogo extends StatefulWidget {
const ShowLogo({Key? key}) : super(key: key);
@override
_ShowLogoState createState() => _ShowLogoState();
}
class _ShowLogoState extends State<ShowLogo> {
late String logo = "";
setAssets() async {
final logoFromAsset = await GetAssets().getLogo("logo_image");
setState(() {
logo = logoFromAsset;
});
}
@override
initState() {
setAssets();
}
@override
Widget build(BuildContext context) {
return Scaffold(body: Image.asset(logo),);
}
}
我可以在手機螢屏上顯示徽標,但仍然出現錯誤:Unable to load asset:這是什么原因?我該如何解決這個問題?
uj5u.com熱心網友回復:
我認為這是因為 Json 資產異步方法呼叫。
當小部件執行 then方法時,嘗試在方法呼叫build(BuildContext context)后立即構建小部件。initState (setAssets)
對于setAssets方法的異步呼叫,方法在設定內部方法build(BuildContext context)之前已經執行,并且第一次變數保留為空字串,這不是有效的資產路徑,這就是為什么無法加載資產/影像并引發錯誤的原因。logo = logoFromAssetsetAssetslogoImage.asset(logo)
setAssets但是,當您的異步方法呼叫執行并setState這次呼叫的片刻之后,小部件將使用非空/有效資產路徑重建并顯示徽標。
嘗試設定默認影像/圖示,我認為這將解決您的問題。
import 'package:flutter/material.dart';
class ShowLogo extends StatefulWidget {
const ShowLogo({Key? key}) : super(key: key);
@override
_ShowLogoState createState() => _ShowLogoState();
}
class _ShowLogoState extends State<ShowLogo> {
late String logo = "";
setAssets() async {
final logoFromAsset = await GetAssets().getLogo("logo_image");
setState(() {
logo = logoFromAsset;
});
}
@override
initState() {
setAssets();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: logo != "" ? Image.asset(logo) : const Icon(Icons.image)
);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442458.html
