Advertisement
antasofa

PageScrollZoom

Nov 7th, 2024 (edited)
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 4.12 KB | Source Code | 0 0
  1. import 'dart:typed_data';
  2. import 'dart:ui';
  3.  
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter/rendering.dart';
  6.  
  7. class PageScrollZoom extends StatefulWidget {
  8.   const PageScrollZoom({super.key});
  9.  
  10.   @override
  11.   State<PageScrollZoom> createState() => _PageScrollZoomState();
  12. }
  13.  
  14. final GlobalKey _cropperKey = GlobalKey(debugLabel: 'cropperKey');
  15.  
  16. final List<ProductModel> products = [
  17.   ProductModel(
  18.       image: Assets.images.menu1.path,
  19.       name: 'Express Bowl Ayam Rica',
  20.       category: ProductCategory.food,
  21.       price: 32000,
  22.       stock: 10),
  23.   // ProductModel(
  24.   //     image: Assets.images.menu2.path,
  25.   //     name: 'Crispy Black Pepper Sauce',
  26.   //     category: ProductCategory.food,
  27.   //     price: 36000,
  28.   //     stock: 10),
  29.   // ProductModel(
  30.   //     image: Assets.images.menu3.path,
  31.   //     name: 'Mie Ayam Teriyaki',
  32.   //     category: ProductCategory.food,
  33.   //     price: 33000,
  34.   //     stock: 10),
  35. ];
  36.  
  37. class _PageScrollZoomState extends State<PageScrollZoom> {
  38.   int _pointersCount = 0;
  39.  
  40.   static Future<Uint8List?> crop({
  41.     required GlobalKey cropperKey,
  42.     double pixelRatio = 3,
  43.   }) async {
  44.     print('crop');
  45.     // Get cropped image
  46.     final renderObject = cropperKey.currentContext!.findRenderObject();
  47.     final boundary = renderObject as RenderRepaintBoundary;
  48.     final image = await boundary.toImage(pixelRatio: pixelRatio);
  49.  
  50.     // Convert image to bytes in PNG format and return
  51.     final byteData = await image.toByteData(
  52.       format: ImageByteFormat.png,
  53.     );
  54.     final pngBytes = byteData?.buffer.asUint8List();
  55.  
  56.     return pngBytes;
  57.   }
  58.  
  59.   @override
  60.   Widget build(BuildContext context) {
  61.     return SingleChildScrollView(
  62.       physics:
  63.           _pointersCount == 2 ? const NeverScrollableScrollPhysics() : null,
  64.       child: Listener(
  65.         onPointerDown: (_) => setState(() => _pointersCount++),
  66.         onPointerUp: (_) => setState(() => _pointersCount--),
  67.         child: Container(
  68.           child: Column(
  69.             children: [
  70.               RepaintBoundary(
  71.                 key: _cropperKey,
  72.                 child: InteractiveViewer(
  73.                     child: Image.asset(
  74.                   products.first.image,
  75.                   fit: BoxFit.fitWidth,
  76.                 )),
  77.               ),
  78.               for (var product in products) ...[
  79.                 const SizedBox(
  80.                     width: double.infinity,
  81.                     child: Divider(
  82.                       thickness: 5,
  83.                     )),
  84.                 Row(
  85.                   children: [
  86.                     Padding(
  87.                       padding: const EdgeInsets.all(8.0),
  88.                       child: ClipOval(
  89.                         child: CircleAvatar(
  90.                           radius: 24,
  91.                           child: Assets.icons.snack.svg(),
  92.                         ),
  93.                       ),
  94.                     ),
  95.                     const Text('User1'),
  96.                   ],
  97.                 ),
  98.                 InteractiveViewer(
  99.                     child: Image.asset(
  100.                   product.image,
  101.                   fit: BoxFit.fitWidth,
  102.                 )),
  103.                 const Row(
  104.                   children: [
  105.                     Padding(
  106.                       padding: EdgeInsets.all(8.0),
  107.                       child: Icon(Icons.favorite),
  108.                     ),
  109.                     Padding(
  110.                       padding: EdgeInsets.all(8.0),
  111.                       child: Icon(Icons.comment),
  112.                     ),
  113.                   ],
  114.                 )
  115.               ],
  116.               ElevatedButton(
  117.                   onPressed: () {
  118.                     print('value = ');
  119.                     crop(cropperKey: _cropperKey).then((value) {
  120.                       if (value != null) {
  121.                         showDialog(
  122.                             context: context,
  123.                             builder: (_) => Image.memory(value));
  124.                       }
  125.                     });
  126.                   },
  127.                   child: Text('Crop'))
  128.             ],
  129.           ),
  130.         ),
  131.       ),
  132.     );
  133.   }
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement