Why is icon tree shaking not possible when building appbundle using flutter with amplify datastore?

105 Views Asked by At

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(),
      ),
    );
  }
}
0

There are 0 best solutions below