Nux
Nux

Reputation: 7098

Flutter: Build web app with file other than 'lib/main.dart'

I use more than one dart main file in my lib folder for passing different app configuration depending on server each will use.

Example of main_dev.dart

void main() async {
  FlavorConfig(
    flavorName: 'test',
    values: {
      'BASE_URL': 'http://$MY_IP:9002/graphql',
      'WS_URL': 'ws://$MY_IP:9002/graphql',
    },
  );

  await runApp(ProviderApp());
}

For now I have main_test.dart and main_live.dart and everything works fine when building android app.

Example I use the following command to build test app.

flutter build apk --obfuscate --split-debug-info=./build/app/outputs/symbols lib/main_test.dart

Note the last part lib/main_test.dart I specify which file I intend to use and it works really well for building android app.

But I tried similar thing for web and I get the following error as it seems to me building web app needs main.dart.

Target dart2js failed: Exception: .dart_tool/flutter_build/11c1feed0a867bb072ab6c7b64967a31/main.dart:8:8: Error: Error when reading 'lib/main.dart': Error reading 'lib/main.dart' (The system cannot find the file specified. ) import 'package:my_amazing_app/main.dart' as entrypoint; ^ .dart_tool/flutter_build/11c1feed0a867bb072ab6c7b64967a31/main.dart:13:3: Error: Method not found: 'main'. entrypoint.main(); ^^^^ Error: Compilation failed.

Compiling lib\main.dart for the Web...
20.3s Exception: Failed to compile application for the Web.

How can can specify the file I want in command for web too?.

I have tried the following without success flutter build web lib/main_test.dart

Upvotes: 2

Views: 2930

Answers (2)

Dan Goldin
Dan Goldin

Reputation: 51

Use -t

flutter build web -t lib/main-test.dart

Upvotes: 4

cameron1024
cameron1024

Reputation: 10196

Rather than using different entrypoints, you can use compile-time constants. When running flutter build, you can pass in --dart-define=foo=bar to set a compile-time constant, and you can then use it from your code using:

const foo = String.fromEnvironment('foo');
print(foo);  // prints "bar"

const fooExists = bool.hasEnvironment('foo');
print(fooExists);  // prints "true"

Note that this is a const value, so the compiler can still use this information for tree shaking.

In your case, assuming you have 2 environments: prod and test, you could do something like this:

// lib/main.dart

void main() {
  const env = String.fromEnvironment('env');
  if (env == 'test') {
    runApp(TestApp());
  } else if (env == 'prod') {
    runApp(ProdApp());
  } else {
    throw 'unknown environment: $env';
  }
}

Then when you build your app, you can use:

flutter build web --dart-define=env=prod <other-args>

Upvotes: 3

Related Questions