// ignore: must_be_immutable import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:news/utils/uiUtils.dart'; import 'package:photo_view/photo_view.dart'; class ImagePreview extends StatefulWidget { final int index; final List imgList; const ImagePreview({super.key, required this.index, required this.imgList}); @override State createState() => StatePreview(); static Route route(RouteSettings routeSettings) { final arguments = routeSettings.arguments as Map; return CupertinoPageRoute(builder: (_) => ImagePreview(index: arguments['index'], imgList: arguments['imgList'])); } } class StatePreview extends State { final GlobalKey _scaffoldKey = GlobalKey(); int? curPos; @override void initState() { super.initState(); curPos = widget.index; } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, body: Stack( children: [ PageView.builder( itemCount: widget.imgList.length, controller: PageController(initialPage: curPos!), onPageChanged: (index) async { setState(() { curPos = index; }); }, itemBuilder: (BuildContext context, int index) { return PhotoView( backgroundDecoration: BoxDecoration(color: Theme.of(context).colorScheme.secondary), initialScale: PhotoViewComputedScale.contained * 0.9, minScale: PhotoViewComputedScale.contained * 0.9, imageProvider: NetworkImage(widget.imgList[index])); }), Positioned.directional( top: 35, start: 20.0, textDirection: Directionality.of(context), child: InkWell( onTap: () { Navigator.of(context).pop(); }, child: ClipRRect( borderRadius: BorderRadius.circular(22.0), child: Container( height: 35, width: 35, alignment: Alignment.center, decoration: BoxDecoration(color: UiUtils.getColorScheme(context).primaryContainer, shape: BoxShape.circle), child: Icon( Icons.keyboard_backspace_rounded, color: UiUtils.getColorScheme(context).surface, ))), )), Positioned(bottom: 10.0, left: 25.0, right: 25.0, child: SelectedPhoto(numberOfDots: widget.imgList.length, photoIndex: curPos!)) ], )); } } class SelectedPhoto extends StatelessWidget { final int? numberOfDots; final int? photoIndex; const SelectedPhoto({super.key, this.numberOfDots, this.photoIndex}); Widget _inactivePhoto(BuildContext context) { return Padding( padding: const EdgeInsetsDirectional.only(start: 3.0, end: 3.0), child: Container(height: 8.0, width: 8.0, decoration: BoxDecoration(color: Theme.of(context).primaryColor.withOpacity(0.4), borderRadius: BorderRadius.circular(4.0))), ); } Widget _activePhoto(BuildContext context) { return Padding( padding: const EdgeInsets.only(left: 5.0, right: 5.0), child: Container( height: 10.0, width: 10.0, decoration: BoxDecoration(color: Theme.of(context).primaryColor, borderRadius: BorderRadius.circular(10.0), boxShadow: const [BoxShadow(color: Colors.grey, spreadRadius: 0.0, blurRadius: 2.0)]), ), ); } List _buildDots(BuildContext context) { List dots = []; for (int i = 0; i < numberOfDots!; i++) { dots.add(i == photoIndex ? _activePhoto(context) : _inactivePhoto(context)); } return dots; } @override Widget build(BuildContext context) { return Center( child: Row(mainAxisAlignment: MainAxisAlignment.center, children: _buildDots(context)), ); } }