Флаттер Переделывает и зацепляет. Как наблюдать за изменением экземпляра переменной внутри эффекта использования, такого как react?

#flutter #redux #hook

Вопрос:

Я новичок в flutter и пытаюсь наблюдать за переменной «count», которая находится в состоянии редуктора, как у React native. Я сделал так, чтобы мои переделки и крючки работали идеально. Количество переменных изменяется на экране, но никогда больше не вызывайте событие useEffect(только один раз), если я изменю действие. Попробовал разные подходы без успеха и попытался поместить StoreProvider.of(context).state.balanceState.count непосредственно в зависимость от эффекта использования. Если я использую useState, он работает так, как должен.

 class StatePage extends HookWidget {
  const StatePage({Key key}) : super(key: key);   


  @override
  Widget build(BuildContext context) {

    int count = StoreProvider.of<AppState>(context).state.balanceState.count;



    useEffect(() {

      WidgetsBinding.instance.addPostFrameCallback((_) =>
          StoreProvider.of<AppState>(context).dispatch(getBalanceThunk()));
    }, [count]);

    return Scaffold(
      appBar: AppBar(
        title: Text('ola'),
      ),
      body: Center(
        child: StoreConnector<AppState, BalanceState>(
          converter: (store) => store.state.balanceState,
          builder: (context, state) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                if (state.loading)
                  Column(
                    children: [
                      CircularProgressIndicator(),
                      SizedBox(
                        height: 30,
                      )
                    ],
                  ),
                Text(state.message),
                Text(count.toString()),
                RaisedButton(
                    child: Text('Clicar'),
                    onPressed: (){
                      StoreProvider.of<AppState>(context).dispatch(SetCountAction(count  ));
                    })
              ],
            );
          },
        ),
      ),
    );
  }
}
 

мое Действие

 abstract class BalanceAction {}


class BalanceStateAction  extends BalanceAction {
    final bool loading;
    final bool error;
    final String message;
    BalanceStateAction(this.loading, this.error, this.message);
}

class SetBalanceAction  extends BalanceAction {
    final double value;
    SetBalanceAction(this.value);
}

class SetCountAction  extends BalanceAction {
    final int count;

    SetCountAction(this.count);
}
 

my Reducer

 import 'package:flutter_red_test/redux/actions/balance_action.dart';

class BalanceState {
  final bool loading;
  final bool error;
  final String message;
  final double value;
  final int count;


  BalanceState({
    this.loading = false,
    this.count = 0,
    this.error = false,
    this.message = '',
    this.value = null,
  });

  factory BalanceState.initialState(){
    return BalanceState(
      loading: false,
      error: false,
      message: '',
      value: null,
      count: 0,
    );
  }

  BalanceState copy({bool loading, bool error, String message, double value, int count}){
    return BalanceState(
        loading: loading ?? this.loading,
        error: error ?? this.error,
        message: message ?? this.message,
        value: value ?? this.value,
      count: count ?? this.count,
    );
  }
}

BalanceState balanceReducer(BalanceState state, BalanceAction action){
        if(action is BalanceStateAction){
          return state.copy(
              loading: action.loading,
              message: action.message,
              value: state.value,
              error: action.error,
            count: state.count,
          );
        }
        if(action is SetBalanceAction){
          return state.copy(
            loading: false,
            message: 'Seu saldo é de 20.000',
            value: action.value,
            count: state.count,
            error: false,
          );
        }
        if(action is SetCountAction){
          return state.copy(
            loading: false,
            message: state.message,
            value: state.value,
            count: action.count,
            error: false,
          );
        }
      return state;
}