关于封装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(),
);
}
}00
相似问题