Untitled

 avatar
unknown
plain_text
11 days ago
9.6 kB
6
Indexable
import 'dart:async';

import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:garibook/app/api/app_urls.dart';
import 'package:garibook/app/utilities/context.dart';
import 'package:garibook/app/utilities/helper.dart';
import 'package:garibook/app/utilities/theme_styles.dart';
import 'package:url_launcher/url_launcher.dart';

import '../../models/app_configuration_model.dart';

class ImageSliderDialog extends StatefulWidget {
  final List<PromotionalPopUp> imageUrls;

  const ImageSliderDialog({Key? key, required this.imageUrls})
      : super(key: key);

  @override
  _ImageSliderDialogState createState() => _ImageSliderDialogState();
}

class _ImageSliderDialogState extends State<ImageSliderDialog> {
  late PageController _pageController;
  int _currentPage = 0;
  double? _imageHeight; // Store dynamic height

  @override
  void initState() {
    super.initState();
    _pageController = PageController(initialPage: _currentPage);
    _fetchImageSize(
        widget.imageUrls![0].image); // Load first image size initially
  }

  Future<void> _fetchImageSize(String imageUrl) async {
    final image = Image.network(AppUrls.Image_Url + imageUrl);
    final completer = Completer<void>();

    image.image.resolve(const ImageConfiguration()).addListener(
      ImageStreamListener((ImageInfo info, bool _) {
        setState(() {
          double screenWidth = context.width * 0.80;
          double aspectRatio = info.image.width / info.image.height;
          _imageHeight =
              screenWidth / aspectRatio; // Calculate height dynamically
        });
        completer.complete();
      }),
    );

    return completer.future;
  }

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

  @override
  Widget build(BuildContext context) {
    return Dialog(
      backgroundColor: Colors.transparent,
      insetPadding: EdgeInsets.zero,
      child: SizedBox(
        width: context.width * 0.80,
        child: Stack(
          children: [
            Container(
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(10),
              ),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Align(
                    alignment: Alignment.topRight,
                    child: InkWell(
                      onTap: () => Navigator.of(context).pop(),
                      child: SizedBox(
                        height: 20,
                        width: 20,
                        child: CircleAvatar(
                          backgroundColor: Colors.white,
                          child: Icon(Icons.close, color: Colors.red, size: 12),
                        ),
                      ),
                    ),
                  ),
                  const Gap(10),
                  if (_imageHeight !=
                      null) // Show only when height is calculated
                    SizedBox(
                      height: _imageHeight,
                      child: ClipRRect(
                        borderRadius: BorderRadius.circular(10),
                        child: PageView.builder(
                          controller: _pageController,
                          itemCount: widget.imageUrls!.length,
                          onPageChanged: (index) {
                            setState(() {
                              _currentPage = index;
                            });
                            _fetchImageSize(widget.imageUrls[index].image);
                          },
                          itemBuilder: (context, index) {
                            return InkWell(
                              onTap: () async {
                                if (widget.imageUrls[index].url != null) {
                                  final canLaunch = await canLaunchUrl(
                                      widget.imageUrls[index].url);
                                  if (canLaunch) {
                                    await launchUrl(
                                        Uri.parse(widget.imageUrls[index].url));
                                  }
                                }
                              },
                              child: CachedNetworkImage(
                                imageUrl: AppUrls.Image_Url +
                                    widget.imageUrls[index].image,
                                imageBuilder: (context, imageProvider) =>
                                    Container(
                                  decoration: BoxDecoration(
                                    image: DecorationImage(
                                      image: imageProvider,
                                      fit: BoxFit.fill,
                                    ),
                                  ),
                                ),
                                placeholder: (context, url) =>
                                    const CupertinoActivityIndicator(),
                                errorWidget: (context, url, error) =>
                                    const Icon(
                                  Icons.error,
                                  color: ThemeStyles.whiteColor,
                                ),
                              ),
                            );
                          },
                        ),
                      ),
                    ),
                  const SizedBox(height: 6),
                  // Indicator row with left and right arrows
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      InkWell(
                        splashColor: Colors.transparent,
                        highlightColor: Colors.transparent,
                        child: SizedBox(
                          height: 20,
                          width: 20,
                          child: Icon(
                            Icons.arrow_back_ios,
                            size: 14,
                            color: Colors.white.withOpacity(0.5),
                          ),
                        ),
                        onTap: () {
                          if (_currentPage > 0) {
                            _pageController.previousPage(
                              duration: const Duration(milliseconds: 300),
                              curve: Curves.easeInOut,
                            );
                          }
                        },
                      ),
                      Row(
                        children:
                            List.generate(widget.imageUrls.length, (index) {
                          return Padding(
                            padding:
                                const EdgeInsets.symmetric(horizontal: 5.0),
                            child: Container(
                              width: 10,
                              height: 10,
                              decoration: BoxDecoration(
                                border: Border.all(
                                  width: 1,
                                  color: _currentPage == index
                                      ? Colors.transparent
                                      : Colors.white.withOpacity(0.5),
                                ),
                                shape: BoxShape.circle,
                                color: _currentPage == index
                                    ? Colors.white.withOpacity(0.5)
                                    : Colors.transparent,
                              ),
                            ),
                          );
                        }),
                      ),
                      InkWell(
                        splashColor: Colors.transparent,
                        highlightColor: Colors.transparent,
                        child: SizedBox(
                          height: 20,
                          width: 20,
                          child: Icon(
                            Icons.arrow_forward_ios,
                            size: 14,
                            color: Colors.white.withOpacity(0.5),
                          ),
                        ),
                        onTap: () {
                          if (_currentPage < widget.imageUrls.length - 1) {
                            _pageController.nextPage(
                              duration: const Duration(milliseconds: 300),
                              curve: Curves.easeInOut,
                            );
                          }
                        },
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// Example usage
void showImageSliderDialog(BuildContext context,
    {List<PromotionalPopUp>? imageUrls}) {
  showDialog(
    barrierColor: Colors.black.withOpacity(0.6),
    context: context,
    builder: (context) {
      return ImageSliderDialog(
        imageUrls: imageUrls != null ? imageUrls : [],
      );
    },
  );
}
Editor is loading...
Leave a Comment