首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使我的旋转木马自动滑行

如何使我的旋转木马自动滑行
EN

Stack Overflow用户
提问于 2022-08-11 20:21:43
回答 2查看 91关注 0票数 0

我制作了一个旋转木马,它检索Firestore上图像的链接。图像的恢复是有效的,但是当位置改变时,图像不会改变,它只显示第一个图像,就像我自动化它时一样。我花了很长时间才被困在上面,我不知道问题出在哪里。下面是我在控制台中遇到的错误:

代码语言:javascript
运行
复制
[VERBOSE-2:ui_dart_state.cc(198)] Unhandled Exception: 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 107 pos 12: '_positions.isNotEmpty': ScrollController not attached to any scroll views.
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
#2      ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:107:12)
#3      PageController.animateToPage (package:flutter/src/widgets/page_view.dart:197:41)
#4      _CarouselWidgetState.initState.<anonymous closure> (package:flyzik/widgets/carousel_widget.dart:36:23)
#5      _rootRunUnary (dart:async/zone.dart:1434:47)
#6      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
#7      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
#8      _CustomZone.bindUnaryCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1281:26)
#9      _rootRunUnary (dart:async/zone.dart:1442:13)
#10     _CustomZone.<…>

以下是我所有的旋转木马源代码:

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

  @override
  State<CarouselWidget> createState() => _CarouselWidgetState();
}

class _CarouselWidgetState extends State<CarouselWidget> {
  int _currentIndex = 0;
  late PageController _pageController;
  late Timer _timer;
  @override
  void initState() {
    _pageController = PageController(initialPage: 0);
    _timer = Timer.periodic(const Duration(seconds: 4), (Timer timer) {
      if (_currentIndex < 5 - 1) {
        _currentIndex++;
      } else {
        _currentIndex = 0;
      }

      _pageController.animateToPage(
        _currentIndex,
        duration: const Duration(milliseconds: 350),
        curve: Curves.easeOutCubic,
      );
    });
    super.initState();
  }

  @override
  void dispose() {
    _pageController.dispose();
    _timer.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<CarouselModel>>(
        stream: DBServices().getCarousels,
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return Center(
              child: Text('Erreur: ' + snapshot.error.toString()),
            );
          }
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Shimmer.fromColors(
              baseColor: kShimmerBaseColor,
              highlightColor: kShimmerHifhtLightColor,
              child: Container(
                width: double.infinity,
                height: 220,
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: Colors.grey),
              ),
            );
          }
          final carousels = snapshot.data;
          return AspectRatio(
                  aspectRatio: 1.81,
                  child: Stack(
                    alignment: Alignment.bottomRight,
                    children: [
                      PageView.builder(
                        itemCount: carousels!.length,
                        controller: _pageController,
                        onPageChanged: (value) {
                          setState(() {
                            _currentIndex = value;
                            print("current index: $value");
                            print("current index2: $_currentIndex");
                          });
                        },
                        itemBuilder: (context, index) => ClipRRect(
                          borderRadius: BorderRadius.all(Radius.circular(12)),
                          child: CachedNetworkImage(
                            imageUrl: carousels[index].imageUrl,
                            fit: BoxFit.cover,
                          ),
                        ),
                      ),
                      Positioned(
                        bottom: defaultPadding,
                        right: defaultPadding,
                        child: Padding(
                          padding:
                              const EdgeInsets.only(left: defaultPadding / 4),
                          child: Row(
                            children: List.generate(
                                carousels.length,
                                (index) => IndicatorDot(
                                    isActive: index == _currentIndex)),
                          ),
                        ),
                      ),
                    ],
                  ),
                );
        });
  }
}

class IndicatorDot extends StatelessWidget {
  const IndicatorDot({
    Key? key,
    required this.isActive,
  }) : super(key: key);
  final bool isActive;

  @override
  Widget build(BuildContext context) {
    return Container(
      height: getProportionateScreenHeight(4),
      width: getProportionateScreenWidth(8),
      decoration: BoxDecoration(
        color: isActive ? kBlack : Colors.white38,
        borderRadius: BorderRadius.all(
          Radius.circular(getProportionateScreenWidth(12)),
        ),
      ),
    );
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-11 21:56:43

您正在尝试调用_pageController.animatePage,而不将控制器交给PageView。这是错误日志中提到的。

失败断言:第107行pos 12:'_positions.isNotEmpty':ScrollController未附加到任何滚动视图.

票数 0
EN

Stack Overflow用户

发布于 2022-08-12 12:41:32

若要避免此类错误,请使用getter

代码语言:javascript
运行
复制
ScrollController.hasClient

如果这是假的,则不能调用与ScrollPosition交互的成员,例如位置、偏移量、animateTo和jumpTo。

例如:

代码语言:javascript
运行
复制
 if (_controller.hasClients) {
      _controller.animateTo(
      ...
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73326502

复制
相关文章

相似问题

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