Flutter应用程序在使用flutter_driver运行时无法加载Json文件

Posted

技术标签:

【中文标题】Flutter应用程序在使用flutter_driver运行时无法加载Json文件【英文标题】:Flutter app can't load Json file while being run with flutter_driver 【发布时间】:2020-01-24 09:58:33 【问题描述】:

我正在尝试设置我的 Flutter 应用程序以使用 flutter_driver 和集成测试自动截屏,但该应用程序卡在应该等待 *.json 文件的未来的位置。 有人知道怎么解决吗?

复制步骤

    设置一个需要读取Json文件的应用(我用过这个方法:String myJson = await rootBundle.loadString('my_resources/myjson.json'); 设置 flutter_driver 测试:

App.dart:

import 'package:flutter_driver/driver_extension.dart';
import 'package:flutter_project/main.dart' as app;

void main() 
  // This line enables the extension.
  enableFlutterDriverExtension();

  // Call the `main()` function of the app, or call `runApp` with
  // any widget you are interested in testing.
  app.main();

App_test.dart:

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() 
  group('MyApp', () 
    FlutterDriver driver;

    setUpAll(() async 
      driver = await FlutterDriver.connect();
    );

    // Close the connection to the driver after the tests have completed.
    tearDownAll(() async 
      if (driver != null) 
        driver.close();
      
    );
  );

    使用flutter drive --target=test_driver/app.dart 运行测试

在我的情况下,应用程序卡在等待来自 1.*.json 文件的未来 使用常规的flutter run 命令一切正常。

颤振医生-v

[✓] Flutter (Channel stable, v1.9.1+hotfix.2, on Mac OS X 10.14.6 18G95, locale de-DE)
    • Flutter version 1.9.1+hotfix.2 at /Users/patrick/Development/flutter
    • Framework revision 2d2a1ffec9 (2 weeks ago), 2019-09-06 18:39:49 -0700
    • Engine revision b863200c37
    • Dart version 2.5.0


[✓] android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/patrick/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    • All Android licenses accepted.

[✓] Xcode - develop for ios and macOS (Xcode 10.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 10.3, Build version 10G8
    • CocoaPods version 1.7.5

[✓] Android Studio (version 3.5)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 39.0.3
    • Dart plugin version 191.8423
    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] VS Code (version 1.38.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.4.1

[✓] Connected device (2 available)
    • iPhone 7  • 5E5C912E-EA1D-438B-B5C5-E963D4BF9B33 • ios • com.apple.CoreSimulator.SimRuntime.iOS-12-4 (simulator)
    • iPhone Xʀ • EE0825D6-B8B4-4010-B954-CC913953F5D4 • ios • com.apple.CoreSimulator.SimRuntime.iOS-12-4 (simulator)

• No issues found!

有没有人解决这个问题?我要导入的 *.json 是一个配置文件,因此导入它以顺利运行对我来说至关重要。任何解决方法都会非常高兴。

【问题讨论】:

【参考方案1】:

在 Flutter GitHub 上有一个悬而未决的问题。 VM 和 Flutter Driver 中的隔离似乎存在问题。

请参阅此评论 https://github.com/flutter/flutter/issues/30641#issuecomment-524868136 它有一个指向 Flutter 分支的链接,其中包含一个测试示例(此处为 https://github.com/vishna/flutter/commit/2f858fc334fc2f43b92c318d02bdbf1ad0984033),该测试已经为我解决了此类问题

另外,也许值得分享您的源代码,以便人们可以运行/调试等。

【讨论】:

我已经能够通过我在这里找到的 IsolateWorkaround 解决 Json 读取错误:github.com/flutter/flutter/issues/24703,但不幸的是,我所有的图像都不再加载了。不幸的是,我无法分享完整的代码,因为它来自我的工作,所以我分享了我能够从项目中分离出来的块。 我看到您提出了一个问题,该问题随后与该问题相关联。我不确定您的问题现在是否与此问题或其他问题有关。也许值得在 24703 上分享您的发现【参考方案2】:

使用此代码加载 JSON:

static Future<String> getJson(String file) async
    
        final ByteData data = await rootBundle.load(file);
        if (data == null) return null;
        return utf8.decode(data.buffer.asUint8List());
    

正如@George Herbert 所说 - 目前存在开放的 Flutter 问题。 所有运行计算的代码都会挂起。

【讨论】:

以上是关于Flutter应用程序在使用flutter_driver运行时无法加载Json文件的主要内容,如果未能解决你的问题,请参考以下文章

Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?

为啥在使用 Flutter 模块构建 iOS 原生应用时修复“Frameworks/Flutter.framework: Permission denied”?

Flutter:在 web 、android 和 ios 中使用相同的应用程序

在 Flutter 使用 GetX 对话框

尝试在我的 Flutter 应用程序中使用 flutter_local_notification 插件构建时出错

无法使用 Flutter 1.22.3 编译 Flutter 应用程序