Skip to content

Failed assertion: line 315 pos 7: 'instanceFactory != null': Object/factory with type LoginViewModel is not registered inside GetIt. #318

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
lamgiahung112 opened this issue May 1, 2023 · 2 comments

Comments

@lamgiahung112
Copy link

lamgiahung112 commented May 1, 2023

I got an error as stated in the title, but only in the instance(), everything else that uses getit's instance work just fine. I checked the log and see that everything is registered properly

My LoginScreen file:

`import 'package:flutter/material.dart';
import 'package:red_tutor_flutter_app/app/dependency_injection.dart';
import 'package:red_tutor_flutter_app/data/network/network_info.dart';
import 'login_viewmodel.dart';
import 'widgets/login_form.dart';
import '../resources/assets_manager.dart';

class LoginScreen extends StatefulWidget {
  const LoginScreen({super.key});

  @override
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final network = instance<NetworkInfo>();
  final _viewModel = instance<LoginViewModel>();

  _bind() {
    _viewModel.start();
  }

  @override
  void initState() {
    _bind();
    super.initState();
  }

  @override
  void dispose() {
    _viewModel.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      body: Stack(
        children: [
          Container(
            decoration: const BoxDecoration(
              image: DecorationImage(
                image: AssetImage(ImageAssets.loginBg),
                fit: BoxFit.cover,
              ),
            ),
          ),
          SafeArea(
            child: Container(
              margin: const EdgeInsets.symmetric(
                vertical: 12,
                horizontal: 12,
              ),
              child: const LoginForm(),
            ),
          ),
        ],
      ),
    );
  }
}
`

My dependency injection file:

`import 'dart:developer';

import 'package:data_connection_checker_nulls/data_connection_checker_nulls.dart';
import 'package:get_it/get_it.dart';
import 'package:red_tutor_flutter_app/app/app_prefs.dart';
import 'package:red_tutor_flutter_app/data/data_sources/remote_data_source.dart';
import 'package:red_tutor_flutter_app/data/network/app_api.dart';
import 'package:red_tutor_flutter_app/data/network/dio_factory.dart';
import 'package:red_tutor_flutter_app/data/network/network_info.dart';
import 'package:red_tutor_flutter_app/data/repository/repository_impl.dart';
import 'package:red_tutor_flutter_app/domain/repository/repository.dart';
import 'package:red_tutor_flutter_app/domain/usecase/login_usecase.dart';
import 'package:red_tutor_flutter_app/presentation/login/login_viewmodel.dart';
import 'package:shared_preferences/shared_preferences.dart';

final instance = GetIt.instance;

Future<void> initAppModule() async {
  final prefs = await SharedPreferences.getInstance();

  // shared preferences instance
  instance.registerLazySingleton<SharedPreferences>(() => prefs);

  // app preferences instance
  instance.registerLazySingleton<AppPreferences>(() => AppPreferences(instance()));

  // network info
  instance
      .registerLazySingleton<NetworkInfo>(() => NetworkInfoImpl(DataConnectionChecker()));

  // dio
  instance.registerLazySingleton<DioFactory>(() => DioFactory(instance()));

  // app service client
  final dio = await instance<DioFactory>().getDio();
  instance.registerLazySingleton<AppServiceClient>(() => AppServiceClient(dio));

  // remote data source
  instance
      .registerLazySingleton<RemoteDataSource>(() => RemoteDataSourceImpl(instance()));

  // repository
  instance
      .registerLazySingleton<Repository>(() => RepositoryImpl(instance(), instance()));
  log("Initialized app modules");
}

initLoginModule() {
  if (!instance.isRegistered<LoginViewModel>()) {
    log('here');
    instance.registerLazySingleton<LoginUseCase>(() => LoginUseCase(instance()));
    instance.registerLazySingleton<LoginViewModel>(() => LoginViewModel(instance()));
    log(instance.isRegistered<LoginViewModel>().toString());
    log("Initialized Login Module");
  }
}
`
@hussenIbrahim
Copy link

See this comment

@lamgiahung112
Copy link
Author

PROBLEM SOLVED

I changed my dependency_injection.dart file name in to di.dart and it just works.
I still don't know why it works tho. It would be great if anyone could give some information about it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants