Flutter 无法从资产中加载文本
Flutter unable to load text from assets
我已阅读 https://flutter.dev/docs/development/ui/assets-and-images#asset-images-in-package-dependencies and 并应用了所有内容,但我的代码仍然无效....
我为此打开了一个新项目,在主文件夹中我创建了资产和一个文件:
pwd
/home/bboett/AndroidStudioProjects/examen_companion
bboett@hayate:~/AndroidStudioProjects/examen_companion$ ls -l assets/
insgesamt 4
-rw-r--r-- 1 bboett bboett 10 19. Mai 15:14 test.txt
bboett@hayate:~/AndroidStudioProjects/examen_companion$ cat assets/test.txt
Hello!!
然后,不信任 android 工作室,我检查了 vi,在 pubspec.yaml 中一切正常:
文件结尾为:
flutter:
uses-material-design: true
assets:
- assets/
我替换了空格,在 uses 和 assets: 之前有 2 个空格,在 - assets...之前有 4 个空格...
在 _MyHomePageState class 我更改了 :
@override
Widget build(BuildContext context)
{
AssetBundle bundle = DefaultAssetBundle.of(context);
return FutureBuilder<String>(
future: bundle.loadString("assets/test.txt"),
builder: (context, AsyncSnapshot<String> snapshot)
{
if (snapshot.hasData) { return Text(snapshot.data.toString()); }
else { return CircularProgressIndicator(); }
}
);
}
不起作用....我从来没有退出进度指示器....
所以我直接在主要部分添加了:
void main() async {
print(await rootBundle.loadString("assets/test.txt"));
runApp(MyApp());
}
然后崩溃:
Launching lib/main.dart on Linux in debug mode...
Building Linux application...
Debug service listening on ws://127.0.0.1:41355/L-ev6_eNIlI=/ws
Syncing files to device Linux...
[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
#0 PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:222:39)
#1 AssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:68:33)
#2 CachingAssetBundle.loadString.<anonymous closure> (package:flutter/src/services/asset_bundle.dart:165:56)
#3 _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:311:23)
#4 CachingAssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:165:27)
#5 main (package:examen_companion/main.dart:9:26)
我在 运行 之前更改了任何内容之后做了一个 flutter clean.....
版本是:
flutter upgrade
Flutter is already up to date on channel beta
Flutter 2.2.0-10.3.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision 06e2fd6357 (vor 11 Tagen) • 2021-05-08 11:28:22 -0700
Engine • revision a123e75c60
Tools • Dart 2.13.0 (build 2.13.0-211.14.beta)
flutter doctor 运行 好的,哦,我在 linux 或 android 上有同样的错误,所以它不是设备....
所以我对如何完成这项工作一无所知,因为我的印象是遵循了文档和以前的帮助:(
顺便说一句,我认为 flutter 现在是空的,安全的...无论如何,我该如何让它工作?
提前致谢
[edit]: 更陌生....我替换了
//future: bundle.loadString("assets/test.txt"),
future: bundle.loadString('AssetManifest.json'),
得到了:
flutter: {"assets/test.txt":["assets/test.txt"],"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"]}
文件在吗???为什么我不能 open/get 呢??
[ed2]:好的,我不明白.....我直接在 main 中尝试了这个:
print(await rootBundle.loadString('AssetManifest.json'));
这也因 null 异常而崩溃....
您必须将 test.txt
放入项目目录的 assets
文件夹中。
此外,如果您可以将您的项目目录结构添加到您的 post。
而不是这个,
flutter:
uses-material-design: true
assets:
- assets/
添加这个,
flutter:
uses-material-design: true
assets:
- assets/test.text
然后运行flutter pub get
。应该没问题。让我们知道它是否有效。
我试过你的代码,它对我有用。资产可能很棘手。有时您需要在添加新资产后完全重新启动应用程序,或者在再次 运行 之前完全卸载应用程序。您也可以尝试 运行 flutter clean
.
一个建议是在 FutureBuilder
中的 else 之前添加 if(snapshot.hasError) print(snapshot.error);
只是为了看看错误是什么,如果它仍然不起作用。
在 main 中打印时出现空检查错误的原因是因为您需要在使用根包之前添加 WidgetsFlutterBinding.ensureInitialized();
以确保您拥有 WidgetsBinding
的实例。
WidgetsFlutterBinding.ensureInitialized()
是解决我的问题的关键,正如@HannesHultergård 所写。补充一下他的回答,主要应该是:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
print(await rootBundle.loadString("assets/test.txt"));
runApp(MyApp());
}
我已阅读 https://flutter.dev/docs/development/ui/assets-and-images#asset-images-in-package-dependencies and
我为此打开了一个新项目,在主文件夹中我创建了资产和一个文件:
pwd
/home/bboett/AndroidStudioProjects/examen_companion
bboett@hayate:~/AndroidStudioProjects/examen_companion$ ls -l assets/
insgesamt 4
-rw-r--r-- 1 bboett bboett 10 19. Mai 15:14 test.txt
bboett@hayate:~/AndroidStudioProjects/examen_companion$ cat assets/test.txt
Hello!!
然后,不信任 android 工作室,我检查了 vi,在 pubspec.yaml 中一切正常:
文件结尾为:
flutter:
uses-material-design: true
assets:
- assets/
我替换了空格,在 uses 和 assets: 之前有 2 个空格,在 - assets...之前有 4 个空格...
在 _MyHomePageState class 我更改了 :
@override
Widget build(BuildContext context)
{
AssetBundle bundle = DefaultAssetBundle.of(context);
return FutureBuilder<String>(
future: bundle.loadString("assets/test.txt"),
builder: (context, AsyncSnapshot<String> snapshot)
{
if (snapshot.hasData) { return Text(snapshot.data.toString()); }
else { return CircularProgressIndicator(); }
}
);
}
不起作用....我从来没有退出进度指示器.... 所以我直接在主要部分添加了:
void main() async {
print(await rootBundle.loadString("assets/test.txt"));
runApp(MyApp());
}
然后崩溃:
Launching lib/main.dart on Linux in debug mode...
Building Linux application...
Debug service listening on ws://127.0.0.1:41355/L-ev6_eNIlI=/ws
Syncing files to device Linux...
[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
#0 PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:222:39)
#1 AssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:68:33)
#2 CachingAssetBundle.loadString.<anonymous closure> (package:flutter/src/services/asset_bundle.dart:165:56)
#3 _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:311:23)
#4 CachingAssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:165:27)
#5 main (package:examen_companion/main.dart:9:26)
我在 运行 之前更改了任何内容之后做了一个 flutter clean.....
版本是:
flutter upgrade
Flutter is already up to date on channel beta
Flutter 2.2.0-10.3.pre • channel beta • https://github.com/flutter/flutter.git
Framework • revision 06e2fd6357 (vor 11 Tagen) • 2021-05-08 11:28:22 -0700
Engine • revision a123e75c60
Tools • Dart 2.13.0 (build 2.13.0-211.14.beta)
flutter doctor 运行 好的,哦,我在 linux 或 android 上有同样的错误,所以它不是设备....
所以我对如何完成这项工作一无所知,因为我的印象是遵循了文档和以前的帮助:(
顺便说一句,我认为 flutter 现在是空的,安全的...无论如何,我该如何让它工作?
提前致谢
[edit]: 更陌生....我替换了
//future: bundle.loadString("assets/test.txt"),
future: bundle.loadString('AssetManifest.json'),
得到了:
flutter: {"assets/test.txt":["assets/test.txt"],"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"]}
文件在吗???为什么我不能 open/get 呢??
[ed2]:好的,我不明白.....我直接在 main 中尝试了这个:
print(await rootBundle.loadString('AssetManifest.json'));
这也因 null 异常而崩溃....
您必须将 test.txt
放入项目目录的 assets
文件夹中。
此外,如果您可以将您的项目目录结构添加到您的 post。
而不是这个,
flutter:
uses-material-design: true
assets:
- assets/
添加这个,
flutter:
uses-material-design: true
assets:
- assets/test.text
然后运行flutter pub get
。应该没问题。让我们知道它是否有效。
我试过你的代码,它对我有用。资产可能很棘手。有时您需要在添加新资产后完全重新启动应用程序,或者在再次 运行 之前完全卸载应用程序。您也可以尝试 运行 flutter clean
.
一个建议是在 FutureBuilder
中的 else 之前添加 if(snapshot.hasError) print(snapshot.error);
只是为了看看错误是什么,如果它仍然不起作用。
在 main 中打印时出现空检查错误的原因是因为您需要在使用根包之前添加 WidgetsFlutterBinding.ensureInitialized();
以确保您拥有 WidgetsBinding
的实例。
WidgetsFlutterBinding.ensureInitialized()
是解决我的问题的关键,正如@HannesHultergård 所写。补充一下他的回答,主要应该是:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
print(await rootBundle.loadString("assets/test.txt"));
runApp(MyApp());
}