easy_mvvm 0.1.0 copy "easy_mvvm: ^0.1.0" to clipboard
easy_mvvm: ^0.1.0 copied to clipboard

An easy mvvm solution that includes ways to manage routes, views, viewmodels, and the mvvm architecture

easy_mvvm #

This is a Flutter package that simplifies state management by following the Model-View-ViewModel (MVVM) architectural pattern. The MVVM pattern separates the user interface (View) from the business logic and data (Model), using a ViewModel to mediate between the two. With easy_mvvm, you can easily manage routes, views, and viewmodels within your Flutter application.

Features #

Detailed Features #

Quick Scaffolding #

The easy_mvvm package allows you to quickly generate the basic structure of views and services using command-line tools. This saves significant development time and ensures consistency by following standardized patterns.

Views and Services #

  • Views: Components responsible for displaying the UI.
  • Services: Components that handle business logic, data retrieval, and other functionalities outside the UI layer.

Command-Line Options #

Developers can use specific commands in their terminal (command-line interface) to generate views and services efficiently. For example:

  • To create a view named ExampleView:

    flutter pub run easy_mvvm create view ExampleView
    
  • To create a lazy singleton service named ExampleService:

    flutter pub run easy_mvvm create service --lazySingleton=ExampleService 
    

Route Management #

Managing navigation is seamless with easy_mvvm, which provides custom page route builders and predefined routes. This feature ensures that navigation logic is clear and maintainable.

  • Custom Page Route Builders: You can define custom page transitions using the RouteTransition class.
  • Defined Routes: Predefined routes (DefinedRoutes) help standardize and simplify the management of different routes in your application.
  • Route Services: The RouteService class handles routing, ensuring that navigation logic is consolidated in one place.
  • Error Handling: Use the RouteErrorTemplate to define custom templates for displaying errors related to routing.

Example:

// Example of using RouteService for navigation
RouteService.navigateTo(context, RouteInfo.home);

Reactive UI Widgets #

The package provides specialized widgets that enable efficient UI updates when working with the MVVM pattern. These widgets help optimize performance by rebuilding only when necessary.

PropertyBuilder #

The PropertyBuilder widget allows you to rebuild only specific parts of your UI when a single property in your ViewModel changes. This optimizes performance by avoiding unnecessary rebuilds of the entire widget tree.

PropertyBuilder<MyViewModel>(
  viewModel: myViewModel,
  propertyName: 'counter',
  builder: (context) {
    return Text('Counter: ${myViewModel.counter}');
  },
)

MultiPropertyBuilder #

The MultiPropertyBuilder widget extends the functionality of PropertyBuilder by allowing you to listen to multiple properties at once. This is useful when a UI component depends on several ViewModel properties.

MultiPropertyBuilder<MyViewModel>(
  viewModel: myViewModel,
  propertyNames: ['firstName', 'lastName'],
  builder: (context) {
    return Text('Name: ${myViewModel.firstName} ${myViewModel.lastName}');
  },
)

Both widgets ensure proper lifecycle management and efficiently update only when needed.

Property Notification #

When a property changes in your ViewModel, you need to notify the UI to rebuild. The EasyViewModel provides two methods for this:

// Notify listeners about a single property change
myViewModel.notifyPropertyChange('counter');

// Notify listeners about multiple property changes
myViewModel.notifyPropertiesChanged(['firstName', 'lastName']);

These methods will trigger rebuilds in any PropertyBuilder or MultiPropertyBuilder widgets that are listening to the specified properties, ensuring your UI stays in sync with your data model.

Getting Started #

Installation #

  1. Add easy_mvvm to your pubspec.yaml:

    dependencies:
      easy_mvvm: <latest_version>
    
  2. Initialize your MVVM project:

    flutter pub run easy_mvvm init
    

Web Recommendation #

For Flutter web applications, it's recommended to use the url_strategy package to remove the # from the URL.

Usage #

Importing easy_mvvm #

To use easy_mvvm in your Flutter project, import it as follows:

import 'package:easy_mvvm/easy_mvvm.dart';

Reactive UI #

Here's a complete example demonstrating how to use these reactive UI widgets:

class ProfileViewModel extends EasyViewModel {
  static const String firstNameProperty = 'firstName';
  static const String lastNameProperty = 'lastName';
  static const String ageProperty = 'age';
  
  String _firstName = 'John';
  String _lastName = 'Doe';
  int _age = 30;
  
  String get firstName => _firstName;
  String get lastName => _lastName;
  int get age => _age;
  
  void updateFirstName(String value) {
    _firstName = value;
    notifyPropertyChange(firstNameProperty);
  }
  
  void updateLastName(String value) {
    _lastName = value;
    notifyPropertyChange(lastNameProperty);
  }
  
  void updateAge(int value) {
    _age = value;
    notifyPropertyChange(ageProperty);
  }
  
  void updateFullProfile(String firstName, String lastName, int age) {
    _firstName = firstName;
    _lastName = lastName;
    _age = age;
    notifyPropertiesChanged([firstNameProperty, lastNameProperty, ageProperty]);
  }
}

// In your widget tree:
Column(
  children: [
    PropertyBuilder<ProfileViewModel>(
      viewModel: profileViewModel,
      propertyName: ProfileViewModel.firstNameProperty,
      builder: (context) {
        return Text('First Name: ${profileViewModel.firstName}');
      },
    ),
    
    PropertyBuilder<ProfileViewModel>(
      viewModel: profileViewModel,
      propertyName: ProfileViewModel.ageProperty,
      builder: (context) {
        return Text('Age: ${profileViewModel.age}');
      },
    ),
    
    MultiPropertyBuilder<ProfileViewModel>(
      viewModel: profileViewModel,
      propertyNames: [ProfileViewModel.firstNameProperty, ProfileViewModel.lastNameProperty],
      builder: (context) {
        return Text('Full Name: ${profileViewModel.firstName} ${profileViewModel.lastName}');
      },
    ),
  ],
)

Command-Line Interface #

General Options #

Option Short Description Usage
create Quickly creates views, and services flutter pub run easy_mvvm create <options>
init Initializes an MVVM project (creates the folder structure and necessary files) flutter pub run easy_mvvm init
--help -h Prints usage information flutter pub run easy_mvvm -h

Create Command Options #

Option Short Description Usage
service Creates a service flutter pub run easy_mvvm create service <options>
view Creates a view and view model flutter pub run easy_mvvm create view <ClassName>
--help -h Prints usage information flutter pub run easy_mvvm create <options> -h

Service Creation Options #

Argument Short Description Usage
--singleton= Creates a singleton service flutter pub run easy_mvvm create service --singleton=<ClassName>
--lazySingleton= Creates a lazy singleton service (Recommended) flutter pub run easy_mvvm create service --lazySingleton=<ClassName>
--factory= Creates a factory for a service flutter pub run easy_mvvm create service --factory=<ClassName>
--async -a The service needs async function to be instantiated flutter pub run easy_mvvm create service --lazySingleton=<ClassName> -a
--help -h Prints usage information flutter pub run easy_mvvm create service <options> -h

View Creation Options #

Argument Short Description Usage
--path=<path_name> -p Use if path name (route) for web is not the same as the class name flutter pub run easy_mvvm create view <ClassName> --path=routePath
--help -h Prints usage information flutter pub run easy_mvvm create view <ClassName> -h

API Documentation #

Router #

  • RouteTransition: Class for custom page route transitions.
  • RouteInfo: Class containing route information.
  • RouteErrorTemplate: Class for defining route error templates.
  • RouteService: Class for managing routing.
  • CustomPageRouteBuilder: (Internal) Custom page route builder.
  • DefinedRoutes: (Internal) Predefined routes.

MVVM #

  • ViewModel: Base class for view models.
  • View: Base class for views.
  • locator: The service locator for dependency injection.

Contributing #

If you'd like to contribute, please submit a pull request or open an issue.

5
likes
140
points
68
downloads

Publisher

verified publisherrutvik.dev

Weekly Downloads

An easy mvvm solution that includes ways to manage routes, views, viewmodels, and the mvvm architecture

Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

animations, args, code_builder, colorize, dart_style, flutter, get_it, meta, pubspec_yaml, recase, universal_platform

More

Packages that depend on easy_mvvm