无法在 flutter 应用程序中加载资产图像
Unable to load asset image in the flutter app
我正在尝试制作一个可以为我掷骰子的应用程序,并遵循相同的教程。看起来教程很旧,这就是我收到错误的原因。该错误将我带到 image_provider.dart 页面,上面写着
<----------------
@protected
Future<ui.Codec> _loadAsync(AssetBundleImageKey key, DecoderCallback decode) async {
ByteData? data;
// Hot reload/restart could change whether an asset bundle or key in a
// bundle are available, or if it is a network backed bundle.
try {
data = await key.bundle.load(key.name);
} on FlutterError {
PaintingBinding.instance.imageCache.evict(key);
rethrow;
}
if (data == null) {
PaintingBinding.instance.imageCache.evict(key);
throw StateError('Unable to read data');
}
return decode(data.buffer.asUint8List());
}
}
---------->
在模拟器中我看不到图像。
import 'package:flutter/material.dart';
import 'homepage.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dice Roller',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.green,
),
home: HomePage(),
);
}
}
这是homepage.dart
import 'dart:math';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
AssetImage one = const AssetImage("images/one.png");
AssetImage two = const AssetImage("images/two.png");
AssetImage three = const AssetImage("images/three.png");
AssetImage four = const AssetImage("images/four.png");
AssetImage five = const AssetImage("images/five.png");
AssetImage six = const AssetImage("images/six.png");
AssetImage? diceImage;
@override
void initState() {
super.initState();
setState(() {
diceImage = one;
});
}
void rollDice() {
int rnd = 1 + (Random().nextInt(6));
AssetImage? newImage;
switch (rnd) {
case 1:
newImage = one;
break;
case 2:
newImage = two;
break;
case 3:
newImage = three;
break;
case 4:
newImage = four;
break;
case 5:
newImage = five;
break;
case 6:
newImage = six;
break;
}
setState(() {
diceImage = newImage;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Dice Roller'),
),
body: Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image(
image: AssetImage('$diceImage'),
width: 200.0,
height: 200.0,
),
Container(
margin: const EdgeInsets.only(top: 100.0),
child: ElevatedButton(
onPressed: rollDice,
child: const Text("Roll The Dice!!"),
),
),
],
),
),
),
);
}
}
这是pubsec.yaml
name: diceroller
description: A new Flutter project.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.17.0 <3.0.0"
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- images/
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages
调试控制台显示无法加载资产:AssetImage(bundle: null, name: "images/one.png")
出现此错误的原因可能有以下任何一种:
1- 图片名称拼写错误
2- 提供的图片路径错误(指定位置不存在图片)
3- pubspec.yaml 文件
中的资产缩进错误
enter image description here
enter image description here
以下代码仅在 one.png 位于图像目录中时有效。如果任何其他目录包含图像目录,则需要在 pubspec.yaml.
中实现它
试试这个并确认。
Image(
image: AssetImage("images/one.png"),
width: 200.0,
height: 200.0,
),
如果可行,您需要检查 $diceImage
的值
试试这个。
Image(
image: diceImage,
width: 200.0,
height: 200.0,
),
diceImage
已经是 AssetImage
.
Image(
image: diceImage,
width: 200.0,
height: 200.0,
),
这里直接赋值AssetImage
AssetImage? diceImage;
@override
void initState() {
super.initState();
setState(() {
diceImage = one;
});
}
所以我相信你应该像这样使用它,
children: <Widget>[
Image(
image: diceImage,
width: 200.0,
height: 200.0,
),
Container(
margin: const EdgeInsets.only(top: 100.0),
child: ElevatedButton(
onPressed: rollDice,
child: const Text("Roll The Dice!!"),
),
),
],
我正在尝试制作一个可以为我掷骰子的应用程序,并遵循相同的教程。看起来教程很旧,这就是我收到错误的原因。该错误将我带到 image_provider.dart 页面,上面写着
<----------------
@protected
Future<ui.Codec> _loadAsync(AssetBundleImageKey key, DecoderCallback decode) async {
ByteData? data;
// Hot reload/restart could change whether an asset bundle or key in a
// bundle are available, or if it is a network backed bundle.
try {
data = await key.bundle.load(key.name);
} on FlutterError {
PaintingBinding.instance.imageCache.evict(key);
rethrow;
}
if (data == null) {
PaintingBinding.instance.imageCache.evict(key);
throw StateError('Unable to read data');
}
return decode(data.buffer.asUint8List());
}
}
---------->
在模拟器中我看不到图像。
import 'package:flutter/material.dart';
import 'homepage.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dice Roller',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.green,
),
home: HomePage(),
);
}
}
这是homepage.dart
import 'dart:math';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
AssetImage one = const AssetImage("images/one.png");
AssetImage two = const AssetImage("images/two.png");
AssetImage three = const AssetImage("images/three.png");
AssetImage four = const AssetImage("images/four.png");
AssetImage five = const AssetImage("images/five.png");
AssetImage six = const AssetImage("images/six.png");
AssetImage? diceImage;
@override
void initState() {
super.initState();
setState(() {
diceImage = one;
});
}
void rollDice() {
int rnd = 1 + (Random().nextInt(6));
AssetImage? newImage;
switch (rnd) {
case 1:
newImage = one;
break;
case 2:
newImage = two;
break;
case 3:
newImage = three;
break;
case 4:
newImage = four;
break;
case 5:
newImage = five;
break;
case 6:
newImage = six;
break;
}
setState(() {
diceImage = newImage;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Dice Roller'),
),
body: Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image(
image: AssetImage('$diceImage'),
width: 200.0,
height: 200.0,
),
Container(
margin: const EdgeInsets.only(top: 100.0),
child: ElevatedButton(
onPressed: rollDice,
child: const Text("Roll The Dice!!"),
),
),
],
),
),
),
);
}
}
这是pubsec.yaml
name: diceroller
description: A new Flutter project.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.17.0 <3.0.0"
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- images/
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages
调试控制台显示无法加载资产:AssetImage(bundle: null, name: "images/one.png")
出现此错误的原因可能有以下任何一种:
1- 图片名称拼写错误 2- 提供的图片路径错误(指定位置不存在图片) 3- pubspec.yaml 文件
中的资产缩进错误enter image description here
enter image description here
以下代码仅在 one.png 位于图像目录中时有效。如果任何其他目录包含图像目录,则需要在 pubspec.yaml.
中实现它试试这个并确认。
Image(
image: AssetImage("images/one.png"),
width: 200.0,
height: 200.0,
),
如果可行,您需要检查 $diceImage
的值试试这个。
Image(
image: diceImage,
width: 200.0,
height: 200.0,
),
diceImage
已经是 AssetImage
.
Image(
image: diceImage,
width: 200.0,
height: 200.0,
),
这里直接赋值AssetImage
AssetImage? diceImage;
@override
void initState() {
super.initState();
setState(() {
diceImage = one;
});
}
所以我相信你应该像这样使用它,
children: <Widget>[
Image(
image: diceImage,
width: 200.0,
height: 200.0,
),
Container(
margin: const EdgeInsets.only(top: 100.0),
child: ElevatedButton(
onPressed: rollDice,
child: const Text("Roll The Dice!!"),
),
),
],