A simple, opinionated, and minimal Flutter application structure for quick start and easy maintenance.

Getting started

Add djangoflow_app as a dependency in your pubspec.yaml file.

  djangoflow_app: <latest version>

Import djangoflow_app and use it to create your root StatelessWidget.

import 'package:djangoflow_app/djangoflow_app.dart';

void main() =>
      onException: (exception, stackTrace) {
        // Your custom exception handling
      rootWidgetBuilder: (appBuilder) async {
        return MaterialApp(
          title: 'Djangoflow App',
          theme: ThemeData(
          home: appBuilder(AppBuilder(
            repositoryProviders: [
              // Your repository providers
            providers: [
              // Your BLoC providers
            listeners: [
              // Your BLoC listeners
            builder: (context) => YourRootWidget(),


AppBuilder: A custom StatelessWidget that allows you to provide global BlocProvider, BlocListener, RepositoryProvider, and callbacks for initState and dispose in a single place.

AppCubitBuilder, AppCubitConsumer, and AppCubitListener: A set of custom BlocBuilder, BlocConsumer, and BlocListener that allows you to listen to the AppCubit state changes.

DjangoflowAppRunner: A custom runApp that allows you to handle exceptions globally and sets up the HydratedBloc storage and BlocObserver for the entire application.

DjangoflowAppSnackbar: A simple SnackBar manager that allows you to show different types of SnackBar (info, error, in-app notification) globally with a single instance.

SandboxBanner: A simple Banner that allows you to show a banner on the top-start corner of the screen with a custom message and color. It's useful to indicate the current environment (e.g., sandbox, production).


DjangoflowAppSnackbar uses ScaffoldMessenger. DjangoflowAppSnackbar's global key needs to be provided to MaterialApp's scaffoldMessengerKey.