0

我已经构建了一个PageView并希望使用Bloc.

我正在使用 aPageController并监听我所在集团的ShowPage状态。然后调用pageController.animateTo动画PageView到所需的页面。

bloc 构建器构建 PageView。

我怀疑我遇到的问题是由于在每次状态更改时BlocBuilder构建一个新PageView的,从而否定pageController.animateTo.

我的问题首先是......可以BlockBuilder防止某些状态的触发/构建(因此它不会“覆盖”我的pageController更改)。或者是否有更好(正确)的方式来实现PageViewwith bloc?

我已将屏幕代码复制到下面的基本肘部以获取信息。

    class _TestScreenState extends State<TestScreen> {
  final PageController _pageController = PageController(initialPage: 4);
  double page = 0;

  @override
  Widget build(BuildContext context) {
    return BlocConsumer<TestCubit, TestState>(listener: (context, state) async {
      if (state is DeviceLogsInitial) {
        await _animateTo(3);
      }
      if (state is ShowPage) {
        await _animateTo(state.page);
      }
    }, builder: (context, state) {
     // _log.info('Building dialog : page ${_pageController.page}');
      return Scaffold(
        appBar: AppBar(
          title: const Text('Test'),// ${_pageController.page}'),
          actions: [
            TextButton(
                onPressed: () {
                  page = _nextPage(page);
                  BlocProvider.of<TestCubit>(context).animate(page);
                },
                child: const Text('swipe'))
          ],
        ),
        body: PageView(
          physics: const NeverScrollableScrollPhysics(),
          controller: _pageController,
          children: const [
            Page0(),
            Page1(),
            Page2(),
            Page3(),
          ],
        ),
      );
    });
  }

  double _nextPage(double page) {
    if (page > 3) {
      page = 0;
    } else {
      page = page + 1;
    }
    return page;
  }

  Future<void> _animateTo(double _page) async {
    _pageController.animateTo(
      _page,
      duration: const Duration(milliseconds: 400),
      curve: Curves.easeInOut,
    );
  }

class TestCubit extends Cubit<TestState> {
  TestCubit() : super(TestInitial());

  Future<void> animate(double page) async {
    emit(ShowPage(page));
  }
}
4

1 回答 1

0

这只是PageController在页面之间使用错误的动画方法的一个例子。

您应该调用的方法 ispageController.animateToPage和 not pageController.animateTo

jumpToPage如果您不需要动画(并且不会jumpTo导致类似问题),您也可以使用。

于 2022-02-14T15:56:00.043 回答