Managing state in Flutter with Dart is one of the most important concepts every mobile developer must master. Whether you’re building a small widget or a large-scale application, state management ensures your UI reacts correctly to data changes. In this tutorial, we’ll learn the simplest way to manage state using StatefulWidget, and also introduce Provider, a widely-used state management library. This guide is intended for Android Studio users.

1. Using StatefulWidget (Basic State Management)
Let’s create a simple counter app that increments a number when a button is pressed.
import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( home: CounterPage(), ); } } class CounterPage extends StatefulWidget { const CounterPage({super.key}); @override State<CounterPage> createState() => _CounterPageState(); } class _CounterPageState extends State<CounterPage> { int _counter = 0; void _increment() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Simple State Example')), body: Center(child: Text('Counter: $_counter')), floatingActionButton: FloatingActionButton( onPressed: _increment, child: const Icon(Icons.add), ), ); } }
2. Using Provider (Advanced State Management)
Add provider dependency in pubspec.yaml
:
dependencies: flutter: sdk: flutter provider: ^6.1.0
Create a CounterProvider
:
import 'package:flutter/foundation.dart'; class CounterProvider with ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } }
Then, wrap your app with ChangeNotifierProvider
:
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'counter_provider.dart'; void main() { runApp( ChangeNotifierProvider( create: (_) => CounterProvider(), child: const MyApp(), ), ); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp(home: CounterPage()); } } class CounterPage extends StatelessWidget { const CounterPage({super.key}); @override Widget build(BuildContext context) { final counter = Provider.of<CounterProvider>(context); return Scaffold( appBar: AppBar(title: const Text('Provider Example')), body: Center(child: Text('Counter: ${counter.count}')), floatingActionButton: FloatingActionButton( onPressed: counter.increment, child: const Icon(Icons.add), ), ); } }
Provider helps separate your business logic from UI, making your app more maintainable and testable. To dive deeper into Flutter state management techniques, you can explore the official Flutter documentation.