File.writeAsString is hanging when I try to run inside a widget test ( my goal is to take a screenshot of the widget undertest using Repaint boundaries on test fail and save the png to a file, same like update golden files with running this command )

  testWidgets("Display correct greeting text and user firstname morning start",
      (WidgetTester _tester) async {
    print("Saving test widget");

    await File("test_generated_4.txt").writeAsString('some content');
    // code never reaches here
    print("Saved test widget");
  });


Solution 1: TSR

Found it

  testWidgets("Display correct greeting text and user firstname morning start",
      (WidgetTester _tester) async {
    await _tester.runAsync(() async {
      print("Saving test widget");

      await File("test_generated_4.txt").writeAsString('some content');
      // await writeToFile(byteDataAll, './test_generated.png');
      print("Saved test widget");
    });
  });

From documentation:

  /// Runs a [callback] that performs real asynchronous work.
  ///
  /// This is intended for callers who need to call asynchronous methods where
  /// the methods spawn isolates or OS threads and thus cannot be executed
  /// synchronously by calling [pump].
  ///
  /// If callers were to run these types of asynchronous tasks directly in
  /// their test methods, they run the possibility of encountering deadlocks.
  ///
  /// If [callback] completes successfully, this will return the future
  /// returned by [callback].
  ///
  /// If [callback] completes with an error, the error will be caught by the
  /// Flutter framework and made available via [takeException], and this method
  /// will return a future that completes with `null`.
  ///
  /// Re-entrant calls to this method are not allowed; callers of this method
  /// are required to wait for the returned future to complete before calling
  /// this method again. Attempts to do otherwise will result in a
  /// [TestFailure] error being thrown.
  ///
  /// If your widget test hangs and you are using [runAsync], chances are your
  /// code depends on the result of a task that did not complete. Fake async
  /// environment is unable to resolve a future that was created in [runAsync].
  /// If you observe such behavior or flakiness, you have a number of options:
  ///
  /// * Consider restructuring your code so you do not need [runAsync]. This is
  ///   the optimal solution as widget tests are designed to run in fake async
  ///   environment.
  ///
  /// * Expose a [Future] in your application code that signals the readiness of
  ///   your widget tree, then await that future inside [callback].
  Future<T?> runAsync<T>(