StateNotifier с 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));
});

person stalwart1014    schedule 17.01.2021    source источник
comment
stackoverflow.com/questions/ 65761240 /   -  person Daniel Aidoo    schedule 18.02.2021


Ответы (2)


Вы не меняете == самого ящика. Это один и тот же объект как до, так и после обновления его членов. Вам нужно либо создать переопределения для == и hashCode, которые правильно отражают значения членов, либо переключиться на другого поставщика, который требует notify_listeners при изменении состояния.

person Randal Schwartz    schedule 17.01.2021

class Drawer with ChangeNotifier{

  void toggleDrawer(){
    if(state.isOpen == true){
  
notifyListeners();
    }else{

notifyListeners();
    }
  }
}

Это будет работать

person Tasnuva oshin    schedule 17.01.2021