我已经构建了一个PageView
并希望使用Bloc
.
我正在使用 aPageController
并监听我所在集团的ShowPage
状态。然后调用pageController.animateTo
动画PageView
到所需的页面。
bloc 构建器构建 PageView。
我怀疑我遇到的问题是由于在每次状态更改时BlocBuilder
构建一个新PageView
的,从而否定pageController.animateTo
.
我的问题首先是......可以BlockBuilder
防止某些状态的触发/构建(因此它不会“覆盖”我的pageController
更改)。或者是否有更好(正确)的方式来实现PageView
with 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));
}
}