ERROR in flutter: widget_test.dart cannot detect MyApp()

Viewed 26824

Being a total beginner I am trying out various flutter feature and I am stuck at running the main.dart due to errors in the widget_test.dart file. Please point out if the error is due to some other reason.

main.dart

import 'package:flutter/material.dart';
 void main(){
   var app = MaterialApp(
     title: 'FlutterApp',
     debugShowCheckedModeBanner: true,
     theme: ThemeData(
        primaryColor: Colors.black12,
        accentColor: Colors.orange,
     ),
     home: Scaffold(
       appBar: AppBar(
         title: Text('Stateless'),
         backgroundColor: Colors.black,
         ),
   ),
   );
   runApp(app);
 }

widget_test.dart

// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility that Flutter provides. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:stateless/main.dart';

void main() {
  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(MyApp()); //error over here

    // Verify that our counter starts at 0.
    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    // Tap the '+' icon and trigger a frame.
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    // Verify that our counter has incremented.
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

This is my very first question and I a very sorry if I couldn't place the question in a proper way

8 Answers

It would be better if you also told us the error message you got. However, from what I see, there is no MyApp defined in widget_test.dart.

You can define a MyApp widget in another file and then import it in your widget_test.dart.

An example would be:

another_file.dart

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
     title: 'FlutterApp',
     debugShowCheckedModeBanner: true,
     theme: ThemeData(
        primaryColor: Colors.black12,
        accentColor: Colors.orange,
     ),
     home: Scaffold(
       appBar: AppBar(
         title: Text('Stateless'),
         backgroundColor: Colors.black,
         ),
   ),);
  }
}

widget_test.dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:stateless/another_file.dart';

void main() {
  testWidgets('My test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(MyApp());
  });
}

It's simple, you can just replace MyApp name with your class name in widget_test.dart file.

eg. replace MyApp with app (in your case) in widget_test.dart file

After you create a file named another_file.dart

You must add:

import '../test/another_file.dart';

in widget_test.dart

I just figured out, the solution is just putting in your actual Stateful Widget name instead of the default 'MyApp' given by the default Tap Counter app!

Your App name is MaterialApp in the main.dart file so as in widget_test.dart file change the MyApp name to MaterialApp as simple as that.

I'am also new to flutter but solving these kind of small problem's gives me a heads up, instead of giving solutions which are a little confusing to follow.

For this you simple add the material app and it's working fine. Let me show my code. I also face the similar issue:

Main.dart

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.grey[600],
          title: Text("I Am Rich"),
        ),
      ),
    ),
  );
}

widget_test.dart

      // Verify that our counter starts at 0.
      expect(find.text('0'), findsOneWidget);
      expect(find.text('1'), findsNothing);

      // Tap the '+' icon and trigger a frame.
      await tester.tap(find.byIcon(Icons.add));
      await tester.pump();

      // Verify that our counter has incremented.
      expect(find.text('0'), findsNothing);
      expect(find.text('1'), findsOneWidget);
    },
  );
}

In this code I simple write MaterialApp in place of MyApp and its also work properly and its easy and simple.

Solution

At top of your pubspec.yaml make sure to verify the name of your project is a match with the name of the imported package listed in your import statement of the test widget.

After you verify this information run flutter pub get to sync the dependencies again.

In my case this resolved the improper name resolution.

Just remove all lines in widget_test.dart file. Empty it.. It is used for testing widgets (not necessary)......

Related