В моем приложении есть пара страниц. На панели приложений у меня есть самодельный виджет с отслеживанием состояния со значком, который показывает количество новых сообщений. Когда я смахиваю, чтобы обновить данные, значок будет запускать небольшую анимацию, если значение значка будет изменено.
Проблема в том, что значение значка исходит из модели с заданной областью действия. Как запустить анимацию из класса модели с ограниченной областью видимости. Я попытался разрешить классу модели с ограниченной областью видимости содержать animationController, а также функцию. Работает на первом и втором экране. Но когда я снова возвращаюсь на первую страницу и нажимаю, чтобы обновить. Это похоже на то, что animationController находится в плохом состоянии.
Код в модели с ограниченной областью видимости:
Function _runNotificationAnimation;
set runNotificationAnimation(Function fun) => _runNotificationAnimation = fun;
void _setNotificationCount(int count) {
_notificationCount = count;
if (count > 0 && _runNotificationAnimation != null) {
_runNotificationAnimation();
}
notifyListeners();
}
функция, запускающая анимацию
runAnim() {
setState(() {
controller.reset();
controller.forward(from: 0.0);
});
}
Ошибка от флаттера:
[VERBOSE-2:shell.cc(184)] Dart Error: Unhandled exception: NoSuchMethodError: The method 'stop' was called on null. Receiver: null Tried calling: stop(canceled: true) 0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5) 1 AnimationController.stop (package:flutter/src/animation/animation_controller.dart:650:13) 2 AnimationController.value= (package:flutter/src/animation/animation_controller.dart:349:5) 3 AnimationController.reset (package:flutter/src/animation/animation_controller.dart:370:5) 4 NotificationIconState.runAnim (package:volvopenta/widgets/notificaton_icon.dart:38:16) 5 SettingsModel._setNotificationCount (package:volvopenta/scoped-models/settings-model.dart:57:7) 6 SettingsModel.updateAppData (package:volvopenta/scoped-models/settings-model.dart:185:5) 7 MyMachines.build... (package:volvopenta/pages/fleet.dart:83:27) 8<…>
Это постепенный переход. Что-то вроде сердцебиения. Круг в стопке, расположенный под значком. Когда запускается анимация. Круг масштабируется, поэтому он становится видимым, а затем гаснет.
см. AnimatedSwitcher и его свойство transitionBuilder
Это сработает. Еще не проверял.
Поскольку ваша анимация будет построена в виджете с отслеживанием состояния, лучше оставить animationController в этом виджете с сохранением состояния и переместить только анимацию (Tween) в класс модели. Важно, чтобы вы поместили notifyListener (); в controller.addListerner (), а не в конце функции.
class MyModel extends Model{
Animation animation;
runAnimation(controller) {
animation = Tween(begin: 0,0, end:
400).animate(controller);
controller.forward();
controller.addListener((){
notifyListeners();
});
}
}
Вы можете вызвать эту функцию в своем виджете с отслеживанием состояния следующим образом:
class _MyScreenState extends State<MyScreen> with
SingleTickerProviderStateMixin{
AnimationController controller;
MyModel myModel = MyModel();
@overide
void initState(){
super.initState();
controller = AnimationController(duration: Duration(seconds: 2), vsync:
this);
myModel.runAnimation(controller);
}
//dispose here
@override
Widget build(Buildcontext context){
return ScopedModel<MyModel>(
model: myModel,
child: Scaffold(
body: Text("Hello", style: TextStyle(fontSize: 13 *
controller.value)),
),
);
}
}
"the badge will run a small animation if the badge value is changed."
- какая анимация? это сложный или просто исчезновение / исчезновение или что-то подобное?