What is Zone in Dart?
A Zone in Dart is an execution context that persists across asynchronous operations. In simple words, it’s a container that :
- Handles uncaught errors in both synchronous and Asynchronous code
- Maintains context across async operations
- Controls how async operations behave
Let’s understand zone in Dart with some practical examples:
Global Error Handling
void main() {
runZonedGuarded(() {
runApp(MyApp());
}, (error, stackTrace) {
// Handle all uncaught errors globally
logError(error, stackTrace);
// Send to crash reporting service
crashlytics.recordError(error, stackTrace);
});
}
The above code catches and reports all errors that occurred either during synchronous or asynchronous operations. It’s one of the most common use cases of using Zone in a flutter application.
Custom Print Interceptor
In the above example, if you check the logs, you will see that we have now intercepted the print command and added our custom print statement.
[2024-10-30 08:05:22.705] 📝 Normal log message
[2024-10-30 08:09:24.891] 📝 Error message
Context Preservation
Zone can be used when you want to preserve some values between various async operations.
void main() {
runZoned(() {
// All code here has access to userId
performUserOperations();
}, zoneValues: {
#userId: 'user-123',
});
}
void performUserOperations() {
// Access zone-local values anywhere in this zone
final userId = Zone.current[#userId];
print('Operating for user: $userId');
}
In the above example, userId
is preserved in the zoneValues
and can be used in the entire zone.
Key Benefits
- Error Isolation: Since zones are isolated, any error in one zone, doesn’t affect other zone.
- Context Preservation: Maintain context in async operation
- Custom Behaviour: Default behavior like scheduling, printing, etc can be overridden
- Global Error Handling: Catch all uncaught errors in one place so they can be logged and reported
Best Practices
- Use Zones for handling application-wide error handling and reporting
- Maintain separate zones for different contexts
- Use zone local values for context preservation
- Don’t use Zones to replace try-catch, it should be used for complex scenarios like background processing or high memory consumption tasks
- Implement proper error handling within zones to understand why and where something went wrong
Zones in Dart are especially useful in large applications to track uncaught errors and report them for further analysis using packages like Firebase Crashalytics. Flutter applications requiring excessive logging or background processes can also use zones for maximum efficiency. Other practical applications include testing frameworks, web servers, and long-running applications.