Shared DevTools Components
This package contains UI, utility, and service components from Dart & Flutter DevTools that can be shared between DevTools, DevTools extensions, and other tooling surfaces that need the same logic or styling.
Usage
The following will add the package as a dependency to your pubspec.yaml (and run an
implicit flutter pub get):
$ flutter pub add devtools_app_shared
Import the component library that you need:
import 'package:devtools_app_shared/service.dart';
import 'package:devtools_app_shared/service_extensions.dart' as extensions;
import 'package:devtools_app_shared/ui.dart';
import 'package:devtools_app_shared/utils.dart';
Examples
- Set and access global variables.
import 'package:devtools_app_shared/utils.dart';
MyCoolClass get coolClass => globals[MyCoolClass] as MyCoolClass;
void main() {
// Creates a globally accessible variable (`globals[ServiceManager]`);
setGlobal(MyCoolClass, MyCoolClass());
coolClass.foo();
}
- Use utilities like the
AutoDisposeMixin, which supports adding listeners that will automatically dispose as part of theStatefulWidgetlifecycle.
import 'package:devtools_app_shared/utils.dart';
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({super.key});
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget>
with AutoDisposeMixin {
var foo = 'hi';
@override
void initState() {
super.initState();
addAutoDisposeListener(someListenable, () {
setState(() {
foo = '$foo hi';
});
});
}
@override
Widget build(BuildContext context) {
return Text(foo);
}
}
- Access shared UI components and styling.
import 'package:devtools_app_shared/ui.dart';
...
@override
Widget build(BuildContext context) {
return RoundedOutlinedBorder( // Shared component
child: Column(
children: [
AreaPaneHeader( // Shared component
roundedTopBorder: false,
includeTopBorder: false,
title: Text('This is a section header'),
),
Expanded(
child: FooWidget(
child: Text(
'Foo',
style: Theme.of(context).subtleTextStyle, // Shared style
),
),
),
],
),
);
}
- VM service management, including access to isolates and service extensions.
import 'package:devtools_app_shared/service.dart';
import 'package:devtools_app_shared/service_extensions.dart' as extensions;
import 'package:devtools_shared/service.dart';
void main() {
final serviceManager = ServiceManager();
// Use the [connectedState] notifier to listen for connection updates.
serviceManager.connectedState.addListener(() {
if (serviceManager.connectedState.value.connected) {
print('Manager connected to VM service');
} else {
print('Manager not connected to VM service');
}
});
// To get a [VmService] object from a vm service URI, consider importing
// `package:devtools_shared/service.dart` from `package:devtools_shared`.
final finishedCompleter = Completer<void>();
final vmService = await connect<VmService>(
uri: Uri.parse(vmServiceUri),
finishedCompleter: finishedCompleter,
serviceFactory: VmService.defaultFactory,
);
await serviceManager.vmServiceOpened(
vmService,
onClosed: finishedCompleter.future,
);
// Get a service extension state.
final ValueListenable<ServiceExtensionState> performanceOverlayEnabled =
serviceManager.manager.serviceExtensionManager.getServiceExtensionState(
extensions.performanceOverlay.extension,
);
// Set a service extension state.
await serviceManager.manager.serviceExtensionManager.setServiceExtensionState(
extensions.performanceOverlay.extension,
enabled: true,
value: true,
);
// Access isolates.
final myIsolate = serviceManager.isolateManager.mainIsolate.value;
// Etc.
}
Issues & feedback
This package is developed as part of the larger flutter/devtools project. Please report any issues or feedback there.
Supported Flutter versions
This package follows the flutter/packages
policy
for supported Flutter versions, which states that a package will support the latest stable
version of Flutter, as well as the current master. In practice, this package will often
support older versions as well, as minimum version requirements are generally only updated
when there is a specific need, such as using a new DevTools or Flutter feature.