Ever needed to respond to mouse movements in your Flutter app? Think Google Maps, where the map updates longitude and latitude as the cursor moves, revealing nearby landmarks. On touch devices, precision is limited, but on web and desktop, the mouse unlocks precise interactions.
Enter Flutter's MouseRegion widget—a powerful tool for detecting mouse presence over specific screen areas. Wrap any widget with MouseRegion to capture events like enter, hover, and exit, enabling dynamic UI responses.
Overview
The MouseRegion widget is essential for apps running on platforms supporting mouse input, such as web and desktop. It triggers callbacks for mouse interactions without requiring button presses, perfect for tooltips, previews, or custom cursors.
Constructor
const MouseRegion({
Key? key,
this.onEnter,
this.onExit,
this.onHover,
this.cursor = MouseCursor.defer,
this.opaque = true,
required this.child,
})No parameters are strictly required beyond child, but callbacks and cursor enhance functionality.
Key Properties
SystemMouseCursors.click) when hovering.Practical Implementation
As experienced Flutter developers, we've used MouseRegion extensively for interactive UIs. Here's a step-by-step example:
Step 1: Create a Container to track.
Container(
height: 80.0,
width: 80.0,
decoration: BoxDecoration(
color: Colors.blueAccent,
borderRadius: BorderRadius.circular(20.0),
border: Border.all(color: Colors.blueAccent),
),
)Step 2: Wrap it in MouseRegion.
Step 3: Customize cursor, e.g., cursor: SystemMouseCursors.click. Popular options include SystemMouseCursors.help, SystemMouseCursors.move, and more.
Step 4: Add event handlers.
Full working example in lib/main.dart:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'MouseRegion Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(title: 'Flutter MouseRegion'),
);
}
}
class MyHomePage extends StatefulWidget {
final String title;
const MyHomePage({super.key, required this.title});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String status = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Mouse Status: $status'),
const SizedBox(height: 30),
MouseRegion(
cursor: SystemMouseCursors.click,
opaque: false,
onEnter: (event) {
setState(() {
status = 'Mouse Entered Region';
});
},
onHover: (event) {
setState(() {
status = 'Mouse Hovering Region';
});
},
onExit: (event) {
setState(() {
status = 'Mouse Exited Region';
});
},
child: Container(
height: 80.0,
width: 80.0,
decoration: BoxDecoration(
color: Colors.blueAccent,
borderRadius: BorderRadius.circular(20.0),
border: Border.all(color: Colors.blueAccent),
),
),
),
],
),
),
);
}
}Final Thoughts
This guide draws from years of Flutter development experience. Experiment with MouseRegion to enhance your apps' interactivity—pair it with other widgets for advanced effects. Dive in and build something amazing!