photo viewer added

This commit is contained in:
meylis98 2023-03-09 03:29:28 +05:00
parent 44c897f6e5
commit 4c5b2afca7
9 changed files with 110 additions and 14 deletions

69
lib/common/photo.dart Normal file
View File

@ -0,0 +1,69 @@
import 'dart:ui';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart';
import 'package:sapaly_shop/themes/app_theme.dart';
class PhotoScreen extends StatefulWidget {
final String image;
const PhotoScreen(this.image);
@override
_PhotoScreenState createState() => _PhotoScreenState();
}
class _PhotoScreenState extends State<PhotoScreen> {
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
final double paddingTop = MediaQueryData.fromWindow(window).padding.top;
return Container(
color: Colors.black,
child: Stack(
children: <Widget>[
PhotoView(
loadingBuilder: (_, chunk) => const Center(
child: CircularProgressIndicator(
color: AppTheme.lightPrimaryColor)),
imageProvider: CachedNetworkImageProvider(widget.image)),
OrientationBuilder(
builder: (cntxt, orientation) {
double height = (orientation == Orientation.portrait
? MediaQuery.of(context).size.height
: MediaQuery.of(context).size.width) *
0.049;
return Container(
height: height,
alignment: Alignment.centerRight,
width: MediaQuery.of(context).size.width * 0.98,
margin: EdgeInsets.only(top: paddingTop),
child: FittedBox(
child: Material(
color: Colors.transparent,
child: InkWell(
onTap: () => Navigator.of(cntxt).pop(),
child: Icon(
Icons.close,
color: Colors.white,
size: height * 0.8,
),
),
),
),
);
},
),
],
),
);
}
}

View File

@ -108,3 +108,11 @@ Future<bool> yesOrNoDialog(BuildContext context,
}) ?? }) ??
false); false);
} }
class CustomScrollBehavior extends ScrollBehavior {
@override
Widget buildOverscrollIndicator(
BuildContext context, Widget child, ScrollableDetails details) {
return child;
}
}

View File

@ -2,6 +2,8 @@ import 'package:adaptix/adaptix.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:sapaly_shop/common/photo.dart';
import 'package:sapaly_shop/features/services/page_navigator.dart';
import 'package:sapaly_shop/features/widgets/sapaly_app_bar.dart'; import 'package:sapaly_shop/features/widgets/sapaly_app_bar.dart';
import 'package:sapaly_shop/models/details_model.dart'; import 'package:sapaly_shop/models/details_model.dart';
import 'package:sapaly_shop/models/settings_model.dart'; import 'package:sapaly_shop/models/settings_model.dart';
@ -52,7 +54,7 @@ class _DetailsState extends State<Details> {
appBar: SapalyAppBar( appBar: SapalyAppBar(
hasActionButton: true, hasActionButton: true,
badge: '2', badge: '2',
title: 'Details', title: widget.description,
actionButton: SvgPicture.asset('assets/icons/cart.svg'), actionButton: SvgPicture.asset('assets/icons/cart.svg'),
leadingButton: const Icon(Icons.arrow_back, color: AppTheme.blackColor), leadingButton: const Icon(Icons.arrow_back, color: AppTheme.blackColor),
leadingOnTap: () { leadingOnTap: () {
@ -72,16 +74,22 @@ class _DetailsState extends State<Details> {
children: [ children: [
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: 15.adaptedPx()), padding: EdgeInsets.symmetric(vertical: 15.adaptedPx()),
child: ClipRRect( child: GestureDetector(
borderRadius: BorderRadius.circular(16.adaptedPx()), onTap: () {
child: CachedNetworkImage( PageNavigator(ctx: context)
imageUrl: widget.image, .nextPage(page: PhotoScreen(widget.image));
width: double.infinity, },
errorWidget: (context, url, error) => Center( child: ClipRRect(
child: SizedBox( borderRadius: BorderRadius.circular(16.adaptedPx()),
height: 150.adaptedPx(), child: CachedNetworkImage(
child: const CircularProgressIndicator( imageUrl: widget.image,
color: AppTheme.lightPrimaryColor, width: double.infinity,
errorWidget: (context, url, error) => Center(
child: SizedBox(
height: 150.adaptedPx(),
child: const CircularProgressIndicator(
color: AppTheme.lightPrimaryColor,
),
), ),
), ),
), ),

View File

@ -5,6 +5,7 @@ import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:sapaly_shop/constants/utils.dart';
import 'package:sapaly_shop/models/settings_model.dart'; import 'package:sapaly_shop/models/settings_model.dart';
import 'package:sapaly_shop/models/sliders_model.dart'; import 'package:sapaly_shop/models/sliders_model.dart';
import 'package:sapaly_shop/models/subcategory_model.dart'; import 'package:sapaly_shop/models/subcategory_model.dart';
@ -98,6 +99,7 @@ class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {
), ),
child: NestedScrollView( child: NestedScrollView(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
scrollBehavior: CustomScrollBehavior(),
headerSliverBuilder: (context, innerBoxIsScrolled) => [ headerSliverBuilder: (context, innerBoxIsScrolled) => [
SliverToBoxAdapter( SliverToBoxAdapter(
child: Column( child: Column(

View File

@ -16,7 +16,7 @@ class SearchScreen extends StatelessWidget {
appBar: SapalyAppBar( appBar: SapalyAppBar(
hasActionButton: false, hasActionButton: false,
badge: '', badge: '',
title: 'search'.translation, title: 'searchHint'.translation,
actionButton: Container(color: AppTheme.lightBackgroundColor), actionButton: Container(color: AppTheme.lightBackgroundColor),
leadingButton: const Icon(Icons.arrow_back, color: AppTheme.blackColor), leadingButton: const Icon(Icons.arrow_back, color: AppTheme.blackColor),
leadingOnTap: () { leadingOnTap: () {

View File

@ -35,7 +35,7 @@ class SapalyAppBar extends StatelessWidget with PreferredSizeWidget {
titleTextStyle: Theme.of(context).primaryTextTheme.bodyMedium?.copyWith( titleTextStyle: Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(
color: AppTheme.blackColor, color: AppTheme.blackColor,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 20.adaptedPx(), fontSize: 17.adaptedPx(),
), ),
toolbarTextStyle: toolbarTextStyle:
Theme.of(context).primaryTextTheme.bodyMedium?.copyWith( Theme.of(context).primaryTextTheme.bodyMedium?.copyWith(

View File

@ -11,5 +11,5 @@
"register":"Agza bolmak", "register":"Agza bolmak",
"your_phone_number":"Siziň telefon belgiňiz", "your_phone_number":"Siziň telefon belgiňiz",
"repeat_password":"Açar sözi gaýtalaň", "repeat_password":"Açar sözi gaýtalaň",
"repeat_password_to_confirm":"Açar sözi tassyklamak üçin gaýtalaň" "repeat_password_to_confirm":"Açar sözi tassyklamak üçin gaýtalaň",
} }

View File

@ -454,6 +454,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.0" version: "5.1.0"
photo_view:
dependency: "direct main"
description:
name: photo_view
sha256: "8036802a00bae2a78fc197af8a158e3e2f7b500561ed23b4c458107685e645bb"
url: "https://pub.dev"
source: hosted
version: "0.14.0"
platform: platform:
dependency: transitive dependency: transitive
description: description:

View File

@ -51,6 +51,7 @@ dependencies:
url_launcher: ^6.1.9 url_launcher: ^6.1.9
shared_preferences: ^2.0.17 shared_preferences: ^2.0.17
provider: ^6.0.5 provider: ^6.0.5
photo_view: ^0.14.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: