[英]StateNotifier with riverpod
我正在尝试使用 Riverpod stateNotifier 来打开和关闭抽屉。 目的是如果抽屉打开,那么主屏幕将通过 AnimatedContainer 缩小/增长。 我不确定问题是什么,但值 x 和 y 没有被 AnimatedContainer 读取或观察。 另外我正确使用 stateNotifier 吗?
主屏幕
@override
Widget build(BuildContext context) {
return SafeArea(
child: Consumer(
builder: (context, watch, child) {
final drawer = watch(drawerProvider).state;
return GestureDetector(
onTap: () {
if(drawer.isOpen){
context.read(drawerProvider).toggleDrawer();
}
},
child: AnimatedContainer(
transform: Matrix4.translationValues(MediaQuery.of(context).size.height * drawer.x,MediaQuery.of(context).size.height * drawer.y, 0)..scale(drawer.scale),
duration: Duration(milliseconds: 250),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(drawer.isOpen ? 20 : 0)),
child:Container(
),
),
);
},
),
);
}
抽屉供应商
import 'package:flutter_riverpod/all.dart';
class Drawer{
double x,y,scale;
bool isOpen;
Drawer(this.x,this.y,this.scale,this.isOpen);
}
class DrawerNotifier extends StateNotifier<Drawer>{
DrawerNotifier(Drawer state) : super(Drawer(0.5,0.1,0.8,true));
void toggleDrawer(){
if(state.isOpen == true){
print(true);
state.x = 0;
state.y = 0;
state.scale = 1;
state.isOpen = false;
}else{
print(false);
state.x = 0.5;
state.y = 0.1;
state.scale = 0.8;
state.isOpen = true;
}
}
}
final drawerProvider = StateNotifierProvider((ref){
return DrawerNotifier(Drawer(0.5,0.1,0.8,true));
});
你没有改变抽屉本身的 == 。 成员更新前后的 Object 相同。 您需要为 == 和 hashCode 创建正确反映成员值的覆盖,或者在“状态”更改时切换到需要notify_listeners
的不同提供程序。
class Drawer with ChangeNotifier{
void toggleDrawer(){
if(state.isOpen == true){
notifyListeners();
}else{
notifyListeners();
}
}
}
它会工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.