Счетчик не меняет своего состояния

#flutter #dart

#флаттер #дротик #dart

Вопрос:

Итак, я пытаюсь создать счетчик в моем пользовательском интерфейсе корзины, который поможет мне обновить количество товара.

           CounterCustom(
            initialValue: _defaultValue,
            minValue: 0,
            maxValue: 10,
            step: 0.5,
            decimalPlaces: 1,
            onChanged: (value) {
              setState(() {
                _defaultValue = value;
                _counter = value;
              });
            },
          ),
  

Это пакет счетчика, который я использую. Если я размещаю этот виджет в ListView непосредственно под моим каркасом, он работает нормально. Но если я помещу этот виджет в пользовательский виджет, он не изменит свое значение на дисплее.

Комментарии:

1. Вы уверены, что значение, которое вы получаете, отличается?

2. да, значение изменяется, но виджет не обновляется.

Ответ №1:

В этом пакете счетчиков так много ограничений. Пожалуйста, подумайте о создании собственного счетчика. Это просто и прямолинейно. Лучше, если вы разделите весь счетчик в другом виджете, чтобы он не создавал все виджеты во время вызова setState . В качестве альтернативы вы можете использовать inheritted widget или управление состоянием поставщика.

 int timerSeconds;
DateTime startedAt;


StartTimer(){

_timer= new Timer.periodic(oneSec, (Timer t) => {
         
      setState(() {
        startedAt=DateTime.now();
        seconds--;
      })
    });
}
//to format the timer text
 String _printDuration(Duration duration) {
    String twoDigits(int n) {
      if (n >= 10) return "$n";
      return "0$n";
    }
    String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
    String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
    return "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
  }

String getTimerText(){
   int timePassed= DateTime.now().difference(startedAt).inSeconds;
   timerTextString=_printDuration(Duration(seconds: timerText-timePassed));
}
  

Затем остановите таймер при утилизации.

 @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }
  

Затем вызовите текстовую строку в текстовом виджете следующим образом

 Text(getTimerText());
  

Комментарии:

1. Я понял суть того, что вы пытаетесь сказать спасибо. Теперь я отключаю этот счетчик, чтобы работать самостоятельно.

2. пожалуйста, не забудьте проголосовать за правильный ответ! Большое спасибо.

3. Извините, я был так занят решением проблемы, что забыл об этом. Я использовал provider для решения этой проблемы. Мне потребовалось 3 часа, лол