🚀 A modular in-app developer console for Flutter apps.
Track logs, API calls, navigation, lifecycle events, screen transitions, app state, and more — all in real time, inside your app.
- ✅ In-app Dev Console with floating overlay
- ✅ Colored logs with filtering and tagging
- ✅ Network call inspector (supports
http
,dio
, andretrofit
) - ✅ Route stack and screen duration tracker
- ✅ Lifecycle event logging
- ✅ Export logs, network calls, and route data
- ✅ Plugin system for adding custom tools
- ✅ App State Inspector (Bloc support)
Add to your pubspec.yaml
:
dependencies:
flutter_dev_toolkit: ^latest_version
Then:
flutter pub get
void main() {
FlutterDevToolkit.init(
config: DevToolkitConfig(
logger: DefaultLogger(),
disableBuiltInPlugins: [
// BuiltInPluginType.logs,
// BuiltInPluginType.network,
// BuiltInPluginType.routes,
// BuiltInPluginType.deviceInfo,
],
),
);
runApp(MyApp());
}
MaterialApp(
builder: (context, child) {
return Stack(
children: [
child!,
const DevOverlay(),
],
);
},
navigatorObservers: [RouteInterceptor.instance],
);
Replace the default client with HttpInterceptor from the toolkit:
import 'package:http/http.dart' as http;
import 'package:flutter_dev_toolkit/flutter_dev_toolkit.dart';
final client = HttpInterceptor(); // Instead of http.Client()
final response = await client.get(Uri.parse('https://example.com'));
Register Dio interceptor:
final dio = Dio();
dio.interceptors.add(DioNetworkInterceptor());
Pass the configured Dio instance to your Retrofit client:
final api = MyApiClient(Dio()..interceptors.add(DioNetworkInterceptor()));
You can add custom developer tools as plugins:
class CounterPlugin extends DevToolkitPlugin {
@override
String get name => 'Counter';
@override
IconData get icon => Icons.exposure_plus_1;
@override
void onInit() => debugPrint('CounterPlugin loaded!');
@override
Widget buildTab(BuildContext context) => Center(child: Text('Counter Tab'));
}
FlutterDevToolkit.registerPlugin(CounterPlugin());
Inspect state transitions (Bloc only for now).
Bloc.observer = DevBlocObserver();
FlutterDevToolkit.registerPlugin(
AppStateInspectorPlugin([
BlocAdapter(),
]),
);
FlutterDevToolkit.logger.log('Message');
FlutterDevToolkit.logger.log('Error occurred', level: LogLevel.error);
You can export relevant data directly from each plugin’s tab:
- Logs Plugin → Export filtered logs
- Network Plugin → Export captured network calls
- Route Tracker → Export route stack and navigation history
MIT