Skip to content

[QUESTION] Api class with @ApiClient() annotation causing error in vaden_application.dart.Β #139

@GuiOliveira-Git

Description

@GuiOliveira-Git

❓ Question

Why is my api file causing an error in the generated vaden file?

πŸ“„ Title

Api class with @ApiClient() annotation causing error in vaden_application.dart

πŸ“ Detailed Description

I am using the lastest version of flutter_vaden (1.0.2).
I have the following api class

import 'package:flutter_vaden/flutter_vaden.dart';
import 'package:myapp/models/launch_model.dart';

@ApiClient()
abstract class LaunchApi {
  @Get('launches/?when=past')
  Future<List<LaunchModel>> fetchPrevLaunches();

  @Get('launches/?when=next')
  Future<List<LaunchModel>> fetchNextLaunches();
}

When I run dart run build_runner build, the vaden_application.dart file is generated, but it has an error in the line _injector.addLazySingleton(LaunchApi.new);. The error is:

A generative constructor of an abstract class can't be torn off.
Try tearing off a constructor of a concrete class, or a non-generative constructor.dart[tearoff_of_generative_constructor_of_abstract_class](https://dart.dev/diagnostics/tearoff_of_generative_constructor_of_abstract_class)"

The entire file is:

// GENERATED CODE - DO NOT MODIFY BY HAND
// Aggregated Vaden application file
// ignore_for_file: prefer_func  tion_declarations_over_variables, implementation_imports
import 'package:myapp/core/configurations/dio_configurations.dart';
import 'package:myapp/data/api/launch_api.dart';
import 'package:myapp/data/repository/launch_repository.dart';
import 'package:myapp/models/agency_model.dart';
import 'package:myapp/models/launch_media_model.dart';
import 'package:myapp/models/launch_model.dart';
import 'package:myapp/models/rocket_configuration_model.dart';
import 'package:myapp/models/rocket_model.dart';
import 'package:myapp/ui/launches/viewmodel/launch_view_model.dart';

import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart' as dioPackage;
import 'package:flutter_vaden/flutter_vaden.dart';

late final AutoInjector _injector;

class VadenApp extends FlutterVadenApplication {
  @override
  AutoInjector get injector => _injector;

  VadenApp({required super.child, AutoInjector? injector}) {
    _injector = injector ?? AutoInjector();
  }

  @override
  Future<void> setup() async {
    final asyncBeans = <Future<void> Function()>[];
    _injector.addLazySingleton<DSON>(_DSON.new);
    _injector.addInstance<Injector>(_injector);

    final configurationDioconfiguration = Dioconfiguration();

    _injector.addLazySingleton(configurationDioconfiguration.createDio);

    _injector.addLazySingleton(LaunchApi.new);

    _injector.addLazySingleton(LaunchRepository.new);

    _injector.addLazySingleton(LaunchViewModel.new);

    _injector.commit();

    for (final asyncBean in asyncBeans) {
      await asyncBean();
    }
  }
}

class _DSON extends DSON {
  @override
  (
    Map<Type, FromJsonFunction>,
    Map<Type, ToJsonFunction>,
    Map<Type, ToOpenApiNormalMap>,
  )
  getMaps() {
    final fromJsonMap = <Type, FromJsonFunction>{};
    final toJsonMap = <Type, ToJsonFunction>{};
    final toOpenApiMap = <Type, ToOpenApiNormalMap>{};

    fromJsonMap[AgencyModel] = (Map<String, dynamic> json) {
      return Function.apply(AgencyModel.new, [], {#name: json['name']});
    };
    toJsonMap[AgencyModel] = (object) {
      final obj = object as AgencyModel;
      return {'name': obj.name};
    };
    toOpenApiMap[AgencyModel] = {
      "type": "object",
      "properties": <String, dynamic>{
        "name": {"type": "string"},
      },
      "required": ["name"],
    };

    fromJsonMap[LaunchMedia] = (Map<String, dynamic> json) {
      return Function.apply(LaunchMedia.new, [], {
        #name: json['name'],
        #url: json['url'],
        #type: MediaType.values.byName(json['type'] as String),
      });
    };
    toJsonMap[LaunchMedia] = (object) {
      final obj = object as LaunchMedia;
      return {'name': obj.name, 'url': obj.url, 'type': obj.type.name};
    };
    toOpenApiMap[LaunchMedia] = {
      "type": "object",
      "properties": <String, dynamic>{
        "name": {"type": "string"},
        "url": {"type": "string"},
        "type": {
          "type": "string",
          "enum": ["video", "livestream"],
        },
      },
      "required": ["name", "url", "type"],
    };

    fromJsonMap[LaunchModel] = (Map<String, dynamic> json) {
      return Function.apply(LaunchModel.new, [], {
        #missionName: json['missionName'],
        #launchDate: DateTime.parse(json['launchDate'] as String),
        #descriptionEnus: json['description_enus'],
        #descriptionPtbr: json['description_ptbr'],
        #rocketConfiguration: fromJson<RocketConfigurationModel>(
          json['rocket_configuration'],
        ),
        #media: fromJsonList<LaunchMedia>(json['media']),
      });
    };
    toJsonMap[LaunchModel] = (object) {
      final obj = object as LaunchModel;
      return {
        'missionName': obj.missionName,
        'launchDate': obj.launchDate.toIso8601String(),
        'description_enus': obj.descriptionEnus,
        'description_ptbr': obj.descriptionPtbr,
        'rocket_configuration': toJson<RocketConfigurationModel>(
          obj.rocketConfiguration,
        ),
        'media': toJsonList<LaunchMedia>(obj.media),
      };
    };
    toOpenApiMap[LaunchModel] = {
      "type": "object",
      "properties": <String, dynamic>{
        "missionName": {"type": "string"},
        "launchDate": {"type": "string", "format": "date-time"},
        "description_enus": {"type": "string"},
        "description_ptbr": {"type": "string"},
        "rocket_configuration": {
          r"$ref": "#/components/schemas/RocketConfigurationModel",
        },
        "media": {
          "type": "array",
          "items": {r"$ref": "#/components/schemas/LaunchMedia"},
        },
      },
      "required": [
        "missionName",
        "launchDate",
        "description_enus",
        "description_ptbr",
        "rocket_configuration",
        "media",
      ],
    };

    fromJsonMap[RocketConfigurationModel] = (Map<String, dynamic> json) {
      return Function.apply(RocketConfigurationModel.new, [], {
        #name: json['name'],
        #rocket: fromJson<RocketModel>(json['rocket']),
      });
    };
    toJsonMap[RocketConfigurationModel] = (object) {
      final obj = object as RocketConfigurationModel;
      return {'name': obj.name, 'rocket': toJson<RocketModel>(obj.rocket)};
    };
    toOpenApiMap[RocketConfigurationModel] = {
      "type": "object",
      "properties": <String, dynamic>{
        "name": {"type": "string"},
        "rocket": {r"$ref": "#/components/schemas/RocketModel"},
      },
      "required": ["name", "rocket"],
    };

    fromJsonMap[RocketModel] = (Map<String, dynamic> json) {
      return Function.apply(RocketModel.new, [], {
        #name: json['name'],
        #agency: fromJson<AgencyModel>(json['agency']),
      });
    };
    toJsonMap[RocketModel] = (object) {
      final obj = object as RocketModel;
      return {'name': obj.name, 'agency': toJson<AgencyModel>(obj.agency)};
    };
    toOpenApiMap[RocketModel] = {
      "type": "object",
      "properties": <String, dynamic>{
        "name": {"type": "string"},
        "agency": {r"$ref": "#/components/schemas/AgencyModel"},
      },
      "required": ["name", "agency"],
    };

    return (fromJsonMap, toJsonMap, toOpenApiMap);
  }
}

πŸ“· Evidence

Image

⚠️ Urgency

  • Low
  • Medium
  • High

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions