【问题标题】:Flutter ImageSlideshow click throughFlutter ImageSlideshow 点击通过
【发布时间】:2026-01-30 20:10:02
【问题描述】:

我想在 Flutter web 中点击我的 ImageSlideshow。 这可能吗?如何,现在我只能刷它。

这是代码

ImageSlideshow(
                  width: 400,
                  height: 800,
                  initialPage: 0,
                  indicatorColor: HexColor("#ff9900"),
                  indicatorBackgroundColor: Colors.grey,
                  children: [
                    Image.asset(
                      'third.png',
                      fit: BoxFit.cover,
                    ),
                    Image.asset(
                      'second.png',
                      fit: BoxFit.cover,
                    ),
                    Image.asset(
                      'first.png',
                      fit: BoxFit.cover,
                    ),
                  ],
                  onPageChanged: (value) {
                    print('Page changed: $value');
                  },
                ),

这是产生错误的无状态部分。

class Information extends StatelessWidget {

PageController _pageController;

  @override
  void initState() {
    _pageController = PageController(
  initialPage: 0,
    );
    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(

感谢您的任何回答。

【问题讨论】:

    标签: flutter web slideshow flutter-web


    【解决方案1】:

    该功能并未内置于该包中,但当您遇到该场景时,您可以复制包代码并对其进行修改。主要区别在于您必须创建自己的PageController 并将其传递给ImageSlideShow。然后将每个孩子包装在 GestureDetector 中,并手动告诉 _pageController 动画到 onTap 中的下一页。

    将此添加到您拥有ImageSlideShow 的有状态小部件中。

     PageController _pageController;
    
      @override
      void initState() {
        _pageController = PageController(
          initialPage: 0,
        );
        super.initState();
      }
    
      @override
      void dispose() {
        _pageController.dispose();
        super.dispose();
      }
    

    创建一个新文件并添加此修改后的包代码版本。唯一的变化是它使用的是传入的PageController,而不是内部创建的。

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    
    class MyImageSlideshow extends StatefulWidget {
      MyImageSlideshow({
        @required this.children,
        @required this.pageController,
        this.width = double.infinity,
        this.height = 200,
        this.initialPage = 0,
        this.indicatorColor = Colors.blue,
        this.indicatorBackgroundColor = Colors.grey,
        this.onPageChanged,
      });
      final List<Widget> children;
      final double width;
      final double height;
      final int initialPage;
      final Color indicatorColor;
      final Color indicatorBackgroundColor;
      final ValueChanged<int> onPageChanged;
      final PageController pageController;
    
      @override
      _MyImageSlideshowState createState() => _MyImageSlideshowState();
    }
    
    class _MyImageSlideshowState extends State<MyImageSlideshow> {
      final StreamController<int> _pageStreamController =
          StreamController<int>.broadcast();
    
      void _onPageChanged(int value) {
        _pageStreamController.sink.add(value);
        if (widget.onPageChanged != null) {
          widget.onPageChanged(value);
        }
      }
    
      Widget _indicator(BuildContext context) {
        return Wrap(
          spacing: 4,
          runSpacing: 4,
          alignment: WrapAlignment.center,
          children: List<Widget>.generate(
            widget.children.length,
            (index) {
              return StreamBuilder<int>(
                initialData: widget.pageController.initialPage,
                stream: _pageStreamController.stream.where(
                  (pageIndex) {
                    return index >= pageIndex - 1 && index <= pageIndex + 1;
                  },
                ),
                builder: (_, AsyncSnapshot<int> snapshot) {
                  return Container(
                    width: 6,
                    height: 6,
                    decoration: ShapeDecoration(
                      shape: CircleBorder(),
                      color: snapshot.data == index
                          ? widget.indicatorColor
                          : widget.indicatorBackgroundColor,
                    ),
                  );
                },
              );
            },
          ),
        );
      }
    
      @override
      void initState() {
        super.initState();
      }
    
      @override
      void dispose() {
        _pageStreamController.close();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return SizedBox(
          width: widget.width,
          height: widget.height,
          child: Stack(
            children: [
              PageView.builder(
                onPageChanged: _onPageChanged,
                itemCount: widget.children.length,
                controller: widget.pageController,
                itemBuilder: (context, index) {
                  return widget.children[index];
                },
              ),
              Positioned(
                left: 0.0,
                right: 0.0,
                bottom: 10.0,
                child: _indicator(context),
              ),
            ],
          ),
        );
      }
    }
    
    

    然后在您的页面上使用新的自定义MyImageSlideshow 而不是添加的GestureDetectors

    MyImageSlideshow(
          pageController: _pageController,
          width: 400,
          height: 800,
          initialPage: 0,
          indicatorColor: HexColor("#ff9900"),
          indicatorBackgroundColor: Colors.grey,
          children: [
            GestureDetector(
              // this is where you're animating to the next picture
              onTap: () {
                if (_pageController.hasClients) {
                  _pageController.animateToPage(
                    1,
                    duration: const Duration(milliseconds: 400),
                    curve: Curves.easeInOut,
                  );
                }
              },
              child: Image.asset(
                'third.png',
                fit: BoxFit.cover,
              ),
            ),
            GestureDetector(
              onTap: () {
                if (_pageController.hasClients) {
                  _pageController.animateToPage(
                    2,
                    duration: const Duration(milliseconds: 400),
                    curve: Curves.easeInOut,
                  );
                }
              },
              child: Image.asset(
                'second.png',
                fit: BoxFit.cover,
              ),
            ),
            GestureDetector(
              onTap: () {
                if (_pageController.hasClients) {
                  _pageController.animateToPage(
                    0, // going back to first picture
                    duration: const Duration(milliseconds: 400),
                    curve: Curves.easeInOut,
                  );
                }
              },
              child: Image.asset(
                'first.png',
                fit: BoxFit.cover,
              ),
            ),
          ],
          onPageChanged: (value) {
            print('Page changed: $value');
          },
        )
    

    这应该为'ya'做。

    【讨论】:

    • 我遇到了新错误:错误:超类没有名为“initState”的方法。并且超类没有名为“dispose”的方法。
    • 您需要将 Information 转换为 StatefulWidget。无状态小部件没有 initState