【问题标题】:Flutter unable to load text from assetsFlutter 无法从资产中加载文本
【发布时间】:2021-08-08 18:34:24
【问题描述】:

我已阅读 https://flutter.dev/docs/development/ui/assets-and-images#asset-images-in-package-dependencies 和 Flutter - Read text file from assets 并应用了所有内容,但我的代码仍然无法正常工作......

为此我打开了一个新项目,在主文件夹中我创建了资产和文件:

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 studio,我用 vi 检查,在 pubspec.yaml 中一切正常:

文件以:

结尾
flutter:
 uses-material-design: true
 assets:
  - assets/

我替换了空格,在uses和assets之前有2个空格:在-assets之前有4个空格...

在我更改的 _MyHomePageState 类中:

  @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 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 上也有同样的错误,所以不是设备....

所以我对如何完成这项工作一无所知,因为我的印象是遵循了文档和以前的帮助:(

顺便说一句,我认为颤振现在是空的,安全的......无论如何,我该如何让它工作?

提前致谢

[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"]}

所以文件在那里???为什么我无法打开/获取它??

[ed2]:好的,我不明白......我直接在 main 中尝试了这个:

 print(await rootBundle.loadString('AssetManifest.json'));

并且由于 null 异常而崩溃了....

【问题讨论】:

    标签: android flutter assets


    【解决方案1】:

    您必须将您的test.txt 放在项目目录中的assets 文件夹中。

    另外,如果您可以将项目目录结构添加到您的帖子中会更好。

    取而代之的是,

    flutter:
     uses-material-design: true
     assets:
      - assets/
    

    添加这个,

    flutter:
     uses-material-design: true
     assets:
      - assets/test.text
    

    然后运行flutter pub get。应该没问题。让我们知道它是否有效。

    【讨论】:

    • 做到了...但我不明白?在flutter.dev/docs/development/ui/… 中写道,如果您在资产名称后面加上 / 整个目录将被包括在内?并通过加载 AssetManifest.json 文件显示?奇怪的东西……
    • 是的,但是有一个接受答案的计时器;)
    • 很高兴知道。如果已解决,则将其标记为已解决。干杯伙伴!
    • 我不确定这是否应该是公认的答案。文档明确指出,如果您以/ 结束路径,则包含目录中的所有文件,并且我从经验中知道它至少适用于图像和字体。如果有原因在这种情况下不起作用,您应该在回答中提供解释。
    • 哦...顺便说一句,我的帖子中有文件结构吗?几乎在帖子的开头......我仍然对我现在必须将资产中的每个文件添加到 pubspec 的事实感到恼火......哦,好吧......
    【解决方案2】:

    我试过你的代码,它对我有用。资产可能很棘手。有时您需要在添加新资产后完全重新启动应用程序,或者在再次运行之前完全卸载应用程序。您也可以尝试运行flutter clean。

    一个建议是在FutureBuilder 中的else 之前添加if(snapshot.hasError) print(snapshot.error); 只是为了看看如果它仍然不起作用,错误是什么。

    在 main 中打印时出现空值检查错误的原因是您需要在使用根包之前添加 WidgetsFlutterBinding.ensureInitialized(); 以确保您拥有 WidgetsBinding 的实例。

    【讨论】:

    • 我做了很多颤振清理:D 但是是的! ensureInitialized 的好指针...忽略了那个.. 是的... WTF ....现在删除 pubspec 工作中的文件名 :( 我宁愿一个干净的错误.....(会有省去了我一天的挫败感:D)嗯关于卸载:这就是为什么我开始在 linux 应用程序和 android 应用程序之间来回切换,但实际上我没有尝试事先卸载该应用程序......
    • 是的,这也让我困惑了几次。当您有奇怪的行为时,Flutter clean 通常会起作用。很高兴你把它整理好了
    【解决方案3】:

    WidgetsFlutterBinding.ensureInitialized() 是解决我的问题的关键,@HannesHultergård 写道。为了补充他的答案,主要应该是:

    void main() async {
     WidgetsFlutterBinding.ensureInitialized();
     print(await rootBundle.loadString("assets/test.txt"));
     runApp(MyApp());
    }
    

    【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2021-05-10
    • 2020-04-11
    • 2020-12-19
    • 2021-10-01
    • 2020-04-26
    • 2020-10-12
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多