1

我的应用程序包含几个页面。在应用程序栏中,我有一个自制的有状态小部件,带有一个显示新消息数量的徽章。当我滑动以刷新数据时,如果徽章值发生更改,徽章将运行一个小动画。

问题是徽章值来自范围模型。如何从作用域模型类运行动画。我试图让作用域模型类包含 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 错误:未处理的异常:NoSuchMethodError:在 null 上调用了方法“停止”。接收者:空尝试调用:停止(取消:真)0 Object.noSuchMethod(dart:core/runtime/libobject_patch.dart:50:5)1 AnimationController.stop(包: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 (包: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/设置-model.dart:185:

4

1 回答 1

1

由于您的动画将构建在有状态的 Widget 中,因此最好将 animationController 留在该有状态的 Widget 中,并仅移动模型类中的动画(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)),
         ),
    );
  }
}
于 2019-12-29T02:56:30.157 回答