The issue I'm having has a simple workaround, simply adding --no-tree-shake-icons after the relevant command, but I'm wondering what's causing the issue here?
The app runs fine when running it through the command flutter run --release, but creating an AAB using the command flutter build appbundle -v results in the following error:
[ +100 ms] [ +12 ms] Target aot_android_asset_bundle failed: IconTreeShakerException: ConstFinder failure: Unhandled exception:
[ +2 ms] Expected a class reference to be valid but was `null`.
[ ] #0 BinaryBuilder._readSimpleInterfaceType (package:kernel/binary/ast_from_binary.dart:3877:7)
[ ] #1 BinaryBuilder.readDartType (package:kernel/binary/ast_from_binary.dart:3789:16)
[ ] #2 BinaryBuilder.readDartTypeList.<anonymous closure> (package:kernel/binary/ast_from_binary.dart:3757:55)
[ ] #3 new List.generate (dart:core-patch/array_patch.dart:60:28)
[ ] #4 BinaryBuilder.readDartTypeList (package:kernel/binary/ast_from_binary.dart:3757:16)
[ ] #5 BinaryBuilder._readInstanceConstant (package:kernel/binary/ast_from_binary.dart:486:42)
[ ] #6 BinaryBuilder.readConstantTableEntry (package:kernel/binary/ast_from_binary.dart:400:16)
[ ] #7 BinaryBuilder.readConstantTable (package:kernel/binary/ast_from_binary.dart:372:27)
[ ] #8 BinaryBuilder._readOneComponent (package:kernel/binary/ast_from_binary.dart:902:5)
[ ] #9 BinaryBuilder.readComponent.<anonymous closure> (package:kernel/binary/ast_from_binary.dart:703:34)
[ ] #10 Timeline.timeSync (dart:developer/timeline.dart:166:22)
[ ] #11 BinaryBuilder.readComponent (package:kernel/binary/ast_from_binary.dart:673:21)
[ ] #12 loadComponentFromBytes (package:kernel/kernel.dart:33:28)
[ ] #13 loadComponentFromBinary (package:kernel/kernel.dart:28:10)
[ ] #14 ConstFinder.findInstances (package:const_finder/const_finder.dart:200:35)
[ ] #15 main (file:///Volumes/Work/s/w/ir/cache/builder/src/flutter/tools/const_finder/bin/main.dart:103:41)
[ ] #16 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:294:33)
[ ] #17 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:189:12)
[ ] To disable icon tree shaking, pass --no-tree-shake-icons to the requested flutter build command
[ ] #0 IconTreeShaker._findConstants (package:flutter_tools/src/build_system/targets/icon_tree_shaker.dart:287:7)
[ ] <asynchronous suspension>
[ ] #1 IconTreeShaker._getIconData (package:flutter_tools/src/build_system/targets/icon_tree_shaker.dart:108:45)
[ ] <asynchronous suspension>
[ ] #2 IconTreeShaker.subsetFont (package:flutter_tools/src/build_system/targets/icon_tree_shaker.dart:172:5)
[ +3 ms] <asynchronous suspension>
[ ] #3 copyAssets.<anonymous closure> (package:flutter_tools/src/build_system/targets/assets.dart:127:25)
[ ] <asynchronous suspension>
[ ] #4 Future.wait.<anonymous closure> (dart:async/future.dart:525:21)
[ ] <asynchronous suspension>
[ ] #5 copyAssets (package:flutter_tools/src/build_system/targets/assets.dart:105:3)
[ ] <asynchronous suspension>
[ ] #6 AndroidAssetBundle.build (package:flutter_tools/src/build_system/targets/android.dart:65:34)
[ ] <asynchronous suspension>
[ ] #7 _BuildInstance._invokeInternal (package:flutter_tools/src/build_system/build_system.dart:847:9)
[ +1 ms] <asynchronous suspension>
[ ] #8 Future.wait.<anonymous closure> (dart:async/future.dart:525:21)
[ ] <asynchronous suspension>
[ ] #9 _BuildInstance.invokeTarget (package:flutter_tools/src/build_system/build_system.dart:785:32)
[ ] <asynchronous suspension>
[ ] #10 Future.wait.<anonymous closure> (dart:async/future.dart:525:21)
[ ] <asynchronous suspension>
[ ] #11 _BuildInstance.invokeTarget (package:flutter_tools/src/build_system/build_system.dart:785:32)
[ ] <asynchronous suspension>
[ ] #12 FlutterBuildSystem.build (package:flutter_tools/src/build_system/build_system.dart:614:16)
[ ] <asynchronous suspension>
[ ] #13 AssembleCommand.runCommand (package:flutter_tools/src/commands/assemble.dart:315:32)
[ ] <asynchronous suspension>
[ ] #14 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1336:27)
[ ] <asynchronous suspension>
[ ] #15 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
[ ] <asynchronous suspension>
[ ] #16 CommandRunner.runCommand (package:args/command_runner.dart:212:13)
[ ] <asynchronous suspension>
[ ] #17 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:296:9)
[ ] <asynchronous suspension>
[ ] #18 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
[ ] <asynchronous suspension>
[ ] #19 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:244:5)
[ ] <asynchronous suspension>
[ ] #20 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:91:9)
[ ] <asynchronous suspension>
[ ] #21 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
[ ] <asynchronous suspension>
[ ] #22 main (package:flutter_tools/executable.dart:91:3)
[ +1 ms] <asynchronous suspension>
[ ] [ +5 ms]
[ ] #0 throwToolExit (package:flutter_tools/src/base/common.dart:10:3)
[ ] #1 AssembleCommand.runCommand (package:flutter_tools/src/commands/assemble.dart:332:7)
[ ] <asynchronous suspension>
[ ] #2 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1336:27)
[ ] <asynchronous suspension>
[ ] #3 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
[ ] <asynchronous suspension>
[ ] #4 CommandRunner.runCommand (package:args/command_runner.dart:212:13)
[ ] <asynchronous suspension>
[ ] #5 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:296:9)
[ ] <asynchronous suspension>
[ ] #6 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
[ ] <asynchronous suspension>
[ ] #7 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:244:5)
[ ] <asynchronous suspension>
[ ] #8 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:91:9)
[ ] <asynchronous suspension>
[ ] #9 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19)
[ +2 ms] <asynchronous suspension>
[ ] #10 main (package:flutter_tools/executable.dart:91:3)
[ ] <asynchronous suspension>
I managed to reduce the problem to the following MWE, along with some amplifyconfiguration.dart and the models from the aws data store in the folder amplify/data_store/models.
Removing either the constructor of AmplifyDataStore or the configuration call await Amplify.configure(amplifyconfig); results in the aforementioned error.
pubspec.yaml
name: my_application
description: My flutter application.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.1+1
environment:
sdk: '>=3.0.5 <4.0.0'
flutter: ">=3.10.5"
dependencies:
flutter:
sdk: flutter
amplify_flutter: ^1.2.0
amplify_datastore: ^1.2.0-supports-only-mobile
flutter:
uses-material-design: true
main.dart
// app
import 'amplify/data_store/models/ModelProvider.dart';
import 'package:flutter/material.dart';
// config
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:amplify_datastore/amplify_datastore.dart';
import 'amplifyconfiguration.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(
const App(),
);
}
class App extends StatefulWidget {
const App({super.key});
@override
State<App> createState() => _AppState();
}
class _AppState extends State<App> {
@override
initState() {
super.initState();
_configureAll();
}
Future<void> _configureAll() async {
await Future.wait([
_configureAmplify(),
]);
}
Future<void> _configureAmplify() async {
// // Add any Amplify plugins you want to use
// final authPlugin = AmplifyAuthCognito();
var dataStorePlugin = AmplifyDataStore(
modelProvider: ModelProvider.instance,
);
await Amplify.addPlugins([
// authPlugin,
// dataStorePlugin,
]);
// You can use addPlugins if you are going to be adding multiple plugins
// await Amplify.addPlugins([authPlugin, analyticsPlugin]);
// Once Plugins are added, configure Amplify
// Note: Amplify can only be configured once.
try {
await Amplify.configure(amplifyconfig);
} on AmplifyAlreadyConfiguredException {
safePrint(
"Tried to reconfigure Amplify; this can occur when your app restarts on Android.",
);
}
}
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
home: const Scaffold(
body: Placeholder(),
),
);
}
}