A Python client library to communicate with a Dart VM Service gRPC server for controlling Flutter applications.
- Install dependencies using pip:
pip install -r requirements.txt-
Ensure you have the Dart SDK installed on your system
- The client can automatically find Dart in your PATH
- Alternatively, you can specify the path to the Dart executable
-
If needed, generate the Python gRPC code:
python -m grpc_tools.protoc -I./protos --python_out=. --grpc_python_out=. ./protos/dart_vm_service.protoThis will create the following files:
dart_vm_service_pb2.pydart_vm_service_pb2_grpc.py
from dart_vm_client import DartVmClient
# Create a client and start the Dart VM Service automatically
with DartVmClient() as client:
# Connect to a Flutter app
response = client.connect("ws://127.0.0.1:8181/ws")
print(f"Connection status: {response.success}, Message: {response.message}")
if response.success:
# Interact with the app
client.tap_widget_by_text("Login")
# Enable debug features
client.toggle_debug_paint(enable=True)
client.toggle_performance_overlay(enable=True)
# Service is automatically stopped when exiting the "with" blockfrom dart_vm_client import DartVmClient, DartVmServiceClient, DartVmServiceManager
# Start the service separately
service_manager = DartVmServiceManager(port=8080)
if service_manager.start():
# Create a client that connects to the running service
client = DartVmServiceClient("localhost:8080")
try:
# Use the client...
client.connect("ws://127.0.0.1:8181/ws")
finally:
# Clean up
client.close()
service_manager.stop()The client provides numerous methods for interacting with Flutter apps, including:
connect(vm_service_uri): Connect to a Flutter app VM serviceclose(): Close the connection
toggle_debug_paint(enable=True): Toggle debug paintingtoggle_repaint_rainbow(enable=True): Toggle repaint rainbowtoggle_performance_overlay(enable=True): Toggle performance overlaytoggle_baseline_painting(enable=True): Toggle baseline paintingtoggle_debug_banner(enable=True): Toggle debug banner
tap_widget_by_key(key_value): Tap a widget by keytap_widget_by_text(text): Tap a widget by textenter_text(key_value, text): Enter text in a widget by keyscroll_into_view_by_key(key_value, alignment=0): Scroll a widget into view by key
dump_widget_tree(): Get the widget treedump_layer_tree(): Get the layer treedump_render_tree(): Get the render treetoggle_inspector(enable=True): Toggle the inspector
And many more. See the dart_vm_service_client.py file for a complete list of available methods.
See example_usage.py for a more detailed example of how to use the client.
If your gRPC server is running on a different host or port, specify it when creating the client:
client = DartVmServiceClient(server_address="192.168.1.100:8080")Use try/except to handle gRPC errors:
import grpc
from dart_vm_service_client import DartVmServiceClient
client = DartVmServiceClient()
try:
response = client.connect("ws://127.0.0.1:8181/")
# Your code here
except grpc.RpcError as e:
print(f"RPC Error: {e.code()}, {e.details()}")
finally:
client.close()