forge_mvvm 1.0.0
forge_mvvm: ^1.0.0 copied to clipboard
Opinionated MVVM + Clean Architecture framework for Flutter with runtime guardrails, typed state primitives, DI modules, and production scaffolding.
import 'package:flutter/material.dart';
import 'package:forge_mvvm/forge_mvvm.dart';
import 'package:go_router/go_router.dart';
import 'features/articles/articles_module.dart';
import 'features/articles/domain/entities/article.dart';
import 'features/articles/ui/article_list_view.dart';
import 'features/home/home_module.dart';
import 'features/home/ui/home_view.dart';
import 'features/login/login_module.dart';
import 'features/login/ui/login_view.dart';
import 'features/signup/signup_module.dart';
import 'features/signup/ui/signup_view.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await ForgeApp.bootstrap(
modules: <ForgeModule>[
HomeModule(),
LoginModule(),
SignUpModule(),
ArticlesModule(),
],
);
final router = GoRouter(
routes: <RouteBase>[
GoRoute(
path: '/',
builder: (_, __) => const HomeView(),
),
GoRoute(
path: '/login',
builder: (_, __) => const LoginView(),
),
GoRoute(
path: '/signup',
builder: (_, __) => const SignUpView(),
),
GoRoute(
path: '/articles',
builder: (_, __) => const ArticleListView(),
),
GoRoute(
path: '/articles/details',
builder: (_, state) {
final article = state.extra! as Article;
return ArticleDetailsView(article: article);
},
),
],
);
ForgeLocator.registerSingleton<ForgeNavigatorAdapter>(
ForgeGoRouterNavigator(router),
layer: ForgeLayer.navigation,
source: 'example-app',
duplicatePolicy: ForgeDuplicateRegistrationPolicy.replace,
);
runApp(ExampleApp(router: router));
}
class ExampleApp extends StatelessWidget {
const ExampleApp({required this.router, super.key});
final GoRouter router;
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'forge_mvvm Example',
theme: ThemeData(colorSchemeSeed: Colors.indigo),
routerConfig: router,
);
}
}