关于封装hi_banner.dart的问题

来源:1-2 课程导学

光_cfstOQ

2天前

老师,你封装的hi_banner.dart是基于SwiperPagination这样的插件来封装的,这样的插件 是可以使用ScrollController来创建控制器的 但是如果是其他的轮播图 比如说card_swiper这个插件,那么它使用的controller是SwiperControl这个控制器,那么在上层的home_page.dart里面 就没法真正和底部的轮播图解耦了 这个是不是还需要另外再封装一层控制器才行?

写回答

1回答

CrazyCodeBoy

2天前

也可以用carousel_slider,可以实现解耦,在课程https://coding.imooc.com/class/741.html
中有应用,以下是封装代码
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:trip_flutter/model/home_model.dart';
import 'package:trip_flutter/util/navigator_util.dart';
import 'package:trip_flutter/util/screen_adapter_helper.dart';

///封装的艺术之轮播图组件的实现
class BannerWidget extends StatefulWidget {
  final List<CommonModel> bannerList;

  const BannerWidget({Key? key, required this.bannerList}) : super(key: key);

  @override
  State<BannerWidget> createState() => _BannerWidgetState();
}

class _BannerWidgetState extends State<BannerWidget> {
  int _current = 0;
  //适配 carousel_slider: ^5.0.0
  final CarouselSliderController _controller = CarouselSliderController();

  @override
  Widget build(BuildContext context) {
    final double width = MediaQuery.of(context).size.width;
    return Stack(
      children: [
        CarouselSlider(
          items:
              widget.bannerList.map((item) => _tabImage(item, width)).toList(),
          carouselController: _controller,
          options: CarouselOptions(
              height: 160.px,
              autoPlay: true,
              viewportFraction: 1.0,
              onPageChanged: (index, reason) {
                setState(() {
                  _current = index;
                });
              }),
        ),
        Positioned(bottom: 10, left: 0, right: 0, child: _indicator())
      ],
    );
  }

  Widget _tabImage(CommonModel model, double width) {
    return GestureDetector(
      onTap: () {
        NavigatorUtil.jumpH5(
            url: model.url, title: model.title, hideAppBar: model.hideAppBar);
      },
      child: Image.network(
        model.icon!,
        width: width,
        fit: BoxFit.cover,
      ),
    );
  }

  _indicator() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: widget.bannerList.asMap().entries.map((entry) {
        return GestureDetector(
          onTap: () => _controller.animateToPage(entry.key),
          child: Container(
            width: 6,
            height: 6,
            margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 4),
            decoration: BoxDecoration(
              shape: BoxShape.circle,
              color:
                  (Colors.white).withOpacity(_current == entry.key ? 0.9 : 0.4),
            ),
          ),
        );
      }).toList(),
    );
  }
}
0
0

Flutter高级进阶实战-仿哔哩哔哩-掌握Flutter高阶技能

一次性掌握Flutter高阶技能+商业级复杂项目架构设计与开发方案

1774 学习 · 892 问题

查看课程