impaktfull_network_interceptor

A lightweight Flutter package to intercept and inspect Dio network calls in-memory, with a built-in review UI.

Features

  • Intercepts all Dio requests, responses, and errors
  • Stores calls in memory — no disk I/O, no setup
  • Built-in list and detail screens to browse captured calls
  • Live call count via ValueNotifier for badge display
  • Listener interface to react to new calls in code
  • No singletons — everything is passed explicitly

Setup

Create a controller and wire it to your Dio instance:

import 'package:impaktfull_network_interceptor/impaktfull_network_interceptor.dart';

final controller = ImpaktfullNetworkInterceptorController();
final dio = Dio()..interceptors.add(ImpaktfullNetworkDioInterceptor(controller: controller));

Keep the controller alive for the lifetime of your app (top-level variable, provider, or similar).

Showing the network call list

Call controller.show(context) from anywhere you have a BuildContext:

TextButton(
  onPressed: () => controller.show(context),
  child: const Text('View network calls'),
)

Displaying a call count badge

callCountNotifier is a ValueNotifier<int> that updates whenever a new call is captured:

ValueListenableBuilder<int>(
  valueListenable: controller.callCountNotifier,
  builder: (context, count, _) {
    return IconButton(
      icon: Badge(
        label: Text('$count'),
        isLabelVisible: count > 0,
        child: const Icon(Icons.list_alt),
      ),
      onPressed: () => controller.show(context),
    );
  },
)

Listening to new calls in code

Implement ImpaktfullNetworkInterceptorListener and register it with the controller:

class MyNetworkListener implements ImpaktfullNetworkInterceptorListener {
  @override
  void onNetworkCallAdded(NetworkCall call) {
    debugPrint('[Network] ${call.method} ${call.uri}');
  }
}

Register and unregister it alongside your widget lifecycle:

final _listener = MyNetworkListener();

@override
void initState() {
  super.initState();
  controller.addListener(_listener);
}

@override
void dispose() {
  controller.removeListener(_listener);
  controller.dispose();
  super.dispose();
}

Dispose

Always call controller.dispose() when you no longer need it.

Public API

Class Description
ImpaktfullNetworkInterceptorController Owns the repository, exposes call count, shows the UI
ImpaktfullNetworkDioInterceptor Dio interceptor — pass your controller in the constructor
ImpaktfullNetworkInterceptorListener Abstract listener for reacting to new calls
NetworkCallsRepository Read-only access to captured calls via callsNotifier
NetworkCall Immutable model for a single captured call
NetworkCallStatus loading / success / error
ImpaktfullNetworkInterceptorListScreen List screen — accepts a repository
NetworkCallDetailScreen Detail screen — accepts a call and repository