State manager for flutter widgets
This plugin allows management of states your objects not using stateful widgets State manager allows you to separate the business logic of managing the state of the model and its presentation
Below is a basic sample application using the state_manager library
import 'package:flutter/material.dart';
import 'package:state_mgr/state_mgr.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Simple stater demo',
home: MyStaterPage(title: 'Flutter Demo Stater Page'),
);
}
}
class MyStaterPage extends StatelessWidget {
const MyStaterPage({super.key, required this.title});
final String title;
static int _counter = 0;
@override
Widget build(BuildContext context) {
return Stater<StateManager>(
builder: (stater) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: (){
_counter++;
stater.invalidate();
},
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
);
}
}Let's take out the logic of processing the states of the counter in a separate class CounterState. 'manager' is used to create a counter state management context
class MyStaterPage extends StatelessWidget {
const MyStaterPage({super.key, required this.title});
final String title;
@override
Widget build(BuildContext context) {
return Stater(
manager: () => CounterState(),
builder: (stater) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'${stater.counter}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => stater.counter++,
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
);
}
}
class CounterState extends StateManager {
int _counter = 0;
int get counter => _counter;
set counter(int value) {
if(_counter == value) return;
_counter = value;
invalidate();
}
}Now all counter state management logic can be performed in a separate CounterState class. For example, let's add emulation of a long wait for a response from the server
class CounterState extends StateManager {
int _counter = 0;
int get counter => _counter;
set counter(int value) {
if(_counter == value) return;
Future.delayed(const Duration(seconds: 1), () {
_counter = value;
invalidate();
});
}
}Now we can expand and add more options to control the counter state logic