首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Cubit或Bloc中使用AnimationController?

如何在Cubit或Bloc中使用AnimationController?
EN

Stack Overflow用户
提问于 2022-07-31 05:58:09
回答 2查看 234关注 0票数 0

我想在AnimationController类中使用StatelessWidget类中的CubitBloc,如果有人可以用示例链接来解释的话?

EN

回答 2

Stack Overflow用户

发布于 2022-07-31 07:59:14

我认为一般的做法是避免在块中使用表示层组件。我会使用Bloc来管理我的状态值,但是在一个有状态的小部件中运行动画组件。

块体

代码语言:javascript
复制
part 'side_bloc.freezed.dart';

typedef StateEmitter = Emitter<SideState>;

class SideBloc extends Bloc<SideEvent, SideState> {
  SideBloc() : super(const SideState(20)) {
    on<SideIncrement>(onIncrement);
    on<SideDecrement>(onDecrement);
  }

  void onIncrement(SideIncrement event, StateEmitter emit) {
    emit(state.copyWith(side: state.side + 10));
  }

  void onDecrement(SideDecrement event, StateEmitter emit) {
    if (state.side <= 10) {
      return;
    }
    emit(state.copyWith(side: state.side - 10));
  }
}

@freezed
class SideEvent with _$SideEvent {
  const factory SideEvent.increment() = SideIncrement;

  const factory SideEvent.decrement() = SideDecrement;
}

@freezed
class SideState with _$SideState {
  const factory SideState(int side) = _SideState;
}

动画组件

代码语言:javascript
复制
class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<int> _animation;
  late CurvedAnimation _curvedAnimation;

  @override
  void initState() {
    _controller = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 1),
    );
    _curvedAnimation = CurvedAnimation(
      parent: _controller,
      curve: Curves.elasticOut,
    );
    _animation = IntTween(begin: 20, end: 20).animate(_curvedAnimation);
    _controller.forward();

    super.initState();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _animateTo(int value) {
    int old = _animation.value;
    _controller.reset();
    _animation = IntTween(begin: old, end: value).animate(
      _curvedAnimation,
    );
    _controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
      ),
      body: BlocListener<SideBloc, SideState>(
        listener: (context, state) {
          _animateTo(state.side);
        },
        child: AnimatedBuilder(
          animation: _animation,
          builder: (context, child) {
            return SizedSquare(side: _animation.value);
          },
        ),
      ),
      floatingActionButton: const SideChangeButtons(),
    );
  }
}

class SideChangeButtons extends StatelessWidget {
  const SideChangeButtons({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.end,
      children: [
        FloatingActionButton(
          onPressed: () =>
              context.read<SideBloc>().add(const SideEvent.increment()),
          child: const Icon(Icons.add),
        ),
        const SizedBox(height: 8),
        FloatingActionButton(
          onPressed: () =>
              context.read<SideBloc>().add(const SideEvent.decrement()),
          child: const Icon(Icons.remove),
        ),
      ],
    );
  }
}

class SizedSquare extends StatelessWidget {
  final int side;

  const SizedSquare({
    Key? key,
    required this.side,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: SizedBox.fromSize(
        size: Size.square(side.toDouble()),
        child: Container(color: Colors.red),
      ),
    );
  }
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-29 09:41:21

AnimationController与TickerProviderStateMixin一起工作,这意味着您必须在小部件树中的某个地方使用statefulWidget。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73181005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档