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());
}