import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@immutable
class Drawer {
final double x;
final double y;
final double scale;
final bool isOpen;
Drawer(this.x, this.y, this.scale, this.isOpen);
factory Drawer.initial() {
return Drawer(0, 0, 1, false);
}
Drawer copyWith({
double x,
double y,
double scale,
bool isOpen,
}) {
return Drawer(
x ?? this.x,
y ?? this.y,
scale ?? this.scale,
isOpen ?? this.isOpen,
);
}
@override
String toString() {
return 'Drawer(x: $x, y: $y, scale: $scale, isOpen: $isOpen)';
}
}
class DrawerNotifier extends StateNotifier<Drawer> {
final Drawer drawer;
DrawerNotifier(this.drawer) : super(drawer ?? Drawer.initial());
void toggleDrawer() {
if (state.isOpen) {
state = state.copyWith(x: 0, y: 0, scale: 1);
} else {
state = state.copyWith(x: 0.5, y: 0.1, scale: 0.8);
}
state = state.copyWith(isOpen: !state.isOpen);
print("new state>> $state");
}
}
final drawerProvider =
StateNotifierProvider((ref) => new DrawerNotifier(Drawer.initial()));
class DrawerScreen extends StatefulWidget {
@override
_DrawerScreenState createState() => _DrawerScreenState();
}
class _DrawerScreenState extends State<DrawerScreen> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Consumer(
builder: (context, watch, child) {
final drawer = watch(drawerProvider.state);
return Container(
width: MediaQuery.of(context).size.width,
child: Column(
children: [
Text(drawer.isOpen.toString()),
Text(drawer.x.toString()),
Text(drawer.y.toString()),
Text(drawer.scale.toString()),
FloatingActionButton(onPressed: () {
context.read(drawerProvider).toggleDrawer();
})
],
),
);
},
),
);
}
}