photo viewer added
This commit is contained in:
parent
44c897f6e5
commit
4c5b2afca7
|
|
@ -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,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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: () {
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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ň",
|
||||||
}
|
}
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue