flutter_ddi 0.8.0 copy "flutter_ddi: ^0.8.0" to clipboard
flutter_ddi: ^0.8.0 copied to clipboard

A Flutter package for easy and clean dependency injection management, enhancing code organization and flexibility.

example/lib/main.dart

import 'dart:async';
import 'dart:math';

import 'package:example/exception/interceptor_blocked.dart';
import 'package:example/model/detail.dart';
import 'package:example/page/details_screen.dart';
import 'package:example/page/first_screen.dart';
import 'package:example/page/home_screen.dart';
import 'package:example/page/second_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_ddi/flutter_ddi.dart';

void main() {
  runApp(MyApp());
}

// Main Application
class MyApp extends StatelessWidget {
  MyApp({super.key});

  late final AppModule appModule = AppModule();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter DDI Routing Example',
      initialRoute: '/',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: Colors.blue,
          brightness: Brightness.light,
        ),
      ),

      /// Generated Routes will be:
      ///
      /// {
      ///   '/': (_) => HomeScreen(),
      ///   '/first': (_) => FirstScreen(),
      ///   '/first/details': (_) => DetailsScreen(),
      ///   '/second': (_) => SecondScreen(),
      /// }
      routes: appModule.getRoutes(),
    );
  }
}

// Main Application Module
class AppModule extends FlutterDDIRouter {
  @override
  String get path => '/';

  @override
  WidgetBuilder get page => (_) => const HomeScreen();

  @override
  List<FlutterDDIModuleDefine> get modules => [
        FirstSubModule(),
        SecondSubModule(),
      ];
}

class Luck extends DDIInterceptor<FlutterDDIModuleDefine> {
  late final Random random = Random();

  @override
  Future<FlutterDDIModuleDefine> onCreate(FlutterDDIModuleDefine instance) async {
    final r = random.nextInt(10) + 1;
    if (r % 2 != 0) {
      ScaffoldMessenger.of(instance.context).showSnackBar(
        const SnackBar(
          content: Text('You are not allowed to access this page'),
          duration: Duration(seconds: 3),
        ),
      );

      Navigator.of(instance.context).pop();

      throw const InterceptorBlockedException('stop');
    }

    return instance;
  }
}

// First Submodule
class FirstSubModule extends FlutterDDIRouter {
  @override
  String get path => '/first';

  @override
  WidgetBuilder get page => (_) => const FirstScreen();

  @override
  List<ModuleInterceptor> get interceptors => [
        ModuleInterceptor.of(factory: Luck.new.builder.asApplication()),
      ];

  @override
  List<FlutterDDIModuleDefine> get modules => [
        DetailsModule(),
      ];
}

// Details Module
class DetailsModule extends FlutterDDIModuleRouter {
  @override
  String get path => '/details';

  @override
  WidgetBuilder get page => (_) => const DetailsScreen();

  @override
  List<ModuleInterceptor> get interceptors => [
        ModuleInterceptor<Luck>.from(),
      ];

  @override
  void onPostConstruct() {
    registerSingleton(() => Detail(message: 'Details Module Loaded'));
  }
}

// Second Submodule
class SecondSubModule extends FlutterDDIModuleRouter {
  @override
  String get path => '/second';

  @override
  WidgetBuilder get page => (_) => const SecondScreen();

  @override
  List<ModuleInterceptor> get interceptors => [
        ModuleInterceptor.of(factory: Luck.new.builder.asApplication()),
      ];

  @override
  FutureOr<void> onPostConstruct() {
    registerObject('Second Sub Module Loaded', qualifier: 'second_sub');
  }
}
2
likes
150
points
74
downloads

Publisher

unverified uploader

Weekly Downloads

A Flutter package for easy and clean dependency injection management, enhancing code organization and flexibility.

Repository (GitHub)
View/report issues

Topics

#dependency-injection #di #inject #dependency #router

Documentation

API reference

License

Apache-2.0 (license)

Dependencies

dart_ddi, flutter

More

Packages that depend on flutter_ddi