view_model_generator

Code generator for the view_model package.

Overview

When using view_model, you need to define a ViewModelProvider for each ViewModel. view_model_generator automates this by generating the provider from a simple annotation.

Before:

final myProvider = ViewModelProvider<MyViewModel>(
  builder: () => MyViewModel(),
);

After:

@genProvider
class MyViewModel extends ViewModel {}

Installation

Add view_model_generator to your dev_dependencies:

dev_dependencies:
  view_model_generator: ^latest_version
  build_runner: ^latest_version

Features

1. Basic Usage

Add @genProvider to your ViewModel class and run dart run build_runner build:

import 'package:view_model/view_model.dart';
part 'my_view_model.vm.dart';

@genProvider
class MyViewModel extends ViewModel {
  MyViewModel();
}

This generates my_view_model.vm.dart with a camelCase provider (e.g., UserViewModel -> userProvider):

final myProvider = ViewModelProvider<MyViewModel>(
  builder: () => MyViewModel(),
);

2. Dependency Injection

The generator detects constructor parameters and creates a provider that accepts them:

@genProvider
class UserViewModel extends ViewModel {
  final int userId;
  final Repository repo;
  UserViewModel(this.userId, this.repo);
}

Usage:

final vm = vef.watch(userProvider(123, repository));

Supports up to 4 required parameters.

3. Singleton Mode

Keep a ViewModel alive even when no widgets use it (useful for global stores):

@GenProvider(aliveForever: true, key: "AuthViewModel")
class AuthViewModel extends ViewModel {}

4. Custom Keys and Tags

Customize key and tag for debugging or instance identification:

@GenProvider(key: 'special_vm', tag: 'v1')
class MyViewModel extends ViewModel {}

// Dynamic keys using expressions
@GenProvider(key: Expression('server_id'))
class ServerViewModel extends ViewModel {
  final String serverId;
  ServerViewModel(this.serverId);
}

5. Custom Factory

Override default creation logic by defining a provider factory:

@genProvider
class SettingsViewModel extends ViewModel {
  final bool isDark;
  SettingsViewModel({this.isDark = false});

  // Generator uses this instead of the constructor
  factory SettingsViewModel.provider({required bool isDark}) =>
      SettingsViewModel(isDark: isDark);
}

Summary

Feature Annotation
Basic Provider @genProvider
Arguments (Automatic based on constructor)
Keep Alive @GenProvider(aliveForever: true)
Custom Key @GenProvider(key: ...)
Control Creation factory ClassName.provider(...)

Libraries

view_model_generator
Configuration for the ViewModel generator.