Коммит df7d95f5 создал по автору Зарубин Виталий Викторович's avatar Зарубин Виталий Викторович
Просмотр файлов

[flutter_image_picker_aurora][feature] Implement image_picker plugin.

владелец 82a8de62
// SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_image_picker_aurora/flutter_image_picker_aurora.dart';
import 'package:image_picker/image_picker.dart';
final navigatorKey = GlobalKey<NavigatorState>();
void main() {
FlutterImagePickerAurora.setGlobalKey(navigatorKey);
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final ImagePicker picker = ImagePicker();
final List<dynamic> _data = [];
Future<void> _pickVideo() async {
// Plugin exec
final XFile? file = await picker.pickVideo(source: ImageSource.gallery);
// Show response
_updateData([file]);
}
Future<void> _pickImage() async {
// Plugin exec
final XFile? file = await picker.pickImage(source: ImageSource.gallery);
// Show response
_updateData([file]);
}
Future<void> _pickImageResize() async {
// Plugin exec
final XFile? file = await picker.pickImage(
source: ImageSource.gallery,
maxWidth: 200,
maxHeight: 200,
imageQuality: 90,
);
// Show response
_updateData([file]);
// Remove resized files
_removeResize([file]);
}
Future<void> _pickImages() async {
// Clear print data
_data.clear();
// Plugin exec
final List<XFile> files = await picker.pickMultiImage(limit: 2);
// Show response
_updateData(files);
}
Future<void> _pickImageOrVideo() async {
// Plugin exec
final XFile? file = await picker.pickMedia();
// Show response
_updateData([file]);
}
Future<void> _pickImagesOrVideos() async {
// Plugin exec
final List<XFile> files = await picker.pickMultipleMedia();
// Show response
_updateData(files);
}
Future<void> _capturePhoto() async {
// Plugin exec
final XFile? file = await picker.pickImage(source: ImageSource.camera);
// Show response
_updateData([file]);
}
Future<void> _captureVideo() async {
// Plugin exec
final XFile? file = await picker.pickVideo(source: ImageSource.camera);
// Show response
_updateData([file]);
}
void _updateData(List<XFile?> files) {
// Clear print data
_data.clear();
// Update data
_data.addAll(files.whereType<XFile>().map((e) => {'name': e.name, 'mimeType': e.mimeType, 'path': e.path}));
// Update view
setState(() {});
}
Future<void> _removeResize(List<XFile?> files) async {
for (final file in files.whereType<XFile>().map((e) => File(e.path))) {
await file.delete();
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
home: Scaffold(
appBar: AppBar(
title: const Text('Flutter Image Picker'),
),
body: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.all(10),
child: Column(
children: [
Text(
'A Flutter plugin for picking images from the image library, and taking new pictures with the camera.',
textAlign: TextAlign.center,
),
const Divider(height: 36),
Text(_data.isEmpty ? "Empty" : _data.toString()),
const Divider(height: 36),
ElevatedButton(
child: const Text('Pick Video'),
onPressed: () async => await _pickVideo(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Pick Image'),
onPressed: () async => await _pickImage(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Pick Image with resize'),
onPressed: () async => await _pickImageResize(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Pick Images (limit: 2)'),
onPressed: () async => await _pickImages(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Pick Image or Video'),
onPressed: () async => await _pickImageOrVideo(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Pick Images or Videos'),
onPressed: () async => await _pickImagesOrVideos(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Capture Photo'),
onPressed: () async => await _capturePhoto(),
),
SizedBox(height: 16),
ElevatedButton(
child: const Text('Capture Video'),
onPressed: () async => await _captureVideo(),
),
],
),
),
),
),
);
}
}
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
async:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
camera:
dependency: transitive
description:
name: camera
sha256: "413d2b34fe28496c35c69ede5b232fb9dd5ca2c3a4cb606b14efc1c7546cc8cb"
url: "https://pub.dev"
source: hosted
version: "0.11.1"
camera_android_camerax:
dependency: transitive
description:
name: camera_android_camerax
sha256: "7cc6adf1868bdcf4e63a56b24b41692dfbad2bec1cdceea451c77798f6a605c3"
url: "https://pub.dev"
source: hosted
version: "0.6.13"
camera_aurora:
dependency: transitive
description:
path: "packages/camera_aurora"
ref: "aurora-camera_aurora-0.6.0"
resolved-ref: "3993b60429014d12475bcc639c20a5d6693b1c24"
url: "https://gitlab.com/omprussia/flutter/packages.git"
source: git
version: "0.6.0"
camera_avfoundation:
dependency: transitive
description:
name: camera_avfoundation
sha256: "1eeb9ce7c9a397e312343fd7db337d95f35c3e65ad5a62ff637c8abce5102b98"
url: "https://pub.dev"
source: hosted
version: "0.9.18+8"
camera_platform_interface:
dependency: transitive
description:
name: camera_platform_interface
sha256: "953e7baed3a7c8fae92f7200afeb2be503ff1a17c3b4e4ed7b76f008c2810a31"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
camera_web:
dependency: transitive
description:
name: camera_web
sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f"
url: "https://pub.dev"
source: hosted
version: "0.3.5"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev"
source: hosted
version: "1.19.0"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
url: "https://pub.dev"
source: hosted
version: "0.3.4+2"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev"
source: hosted
version: "1.0.8"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
file_selector:
dependency: transitive
description:
name: file_selector
sha256: "5019692b593455127794d5718304ff1ae15447dea286cdda9f0db2a796a1b828"
url: "https://pub.dev"
source: hosted
version: "1.0.3"
file_selector_android:
dependency: transitive
description:
name: file_selector_android
sha256: "98ac58e878b05ea2fdb204e7f4fc4978d90406c9881874f901428e01d3b18fbc"
url: "https://pub.dev"
source: hosted
version: "0.5.1+12"
file_selector_ios:
dependency: transitive
description:
name: file_selector_ios
sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420"
url: "https://pub.dev"
source: hosted
version: "0.5.3+1"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
url: "https://pub.dev"
source: hosted
version: "0.9.3+2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc"
url: "https://pub.dev"
source: hosted
version: "0.9.4+2"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
url: "https://pub.dev"
source: hosted
version: "2.6.2"
file_selector_web:
dependency: transitive
description:
name: file_selector_web
sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7
url: "https://pub.dev"
source: hosted
version: "0.9.4+2"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4"
url: "https://pub.dev"
source: hosted
version: "0.9.3+3"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_image_picker_aurora:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "0.0.1"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
url: "https://pub.dev"
source: hosted
version: "5.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e"
url: "https://pub.dev"
source: hosted
version: "2.0.24"
flutter_selector_aurora:
dependency: transitive
description:
path: "packages/flutter_selector_aurora"
ref: "aurora-flutter_selector_aurora-0.0.1"
resolved-ref: "82a8de624daa53ad1cb9f601c7aad6a4511d85f1"
url: "git@os-git.omprussia.ru:oss/flutter/flutter-community-plugins/pickers_aurora.git"
source: git
version: "0.0.1"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http:
dependency: transitive
description:
name: http
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.3.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
image:
dependency: transitive
description:
name: image
sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6"
url: "https://pub.dev"
source: hosted
version: "4.5.2"
image_picker:
dependency: "direct main"
description:
name: image_picker
sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: b62d34a506e12bb965e824b6db4fbf709ee4589cf5d3e99b45ab2287b008ee0c
url: "https://pub.dev"
source: hosted
version: "0.8.12+20"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
url: "https://pub.dev"
source: hosted
version: "0.8.12+2"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1"
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
url: "https://pub.dev"
source: hosted
version: "2.10.1"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
intl:
dependency: transitive
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
url: "https://pub.dev"
source: hosted
version: "0.20.2"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev"
source: hosted
version: "10.0.7"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev"
source: hosted
version: "3.0.8"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
lints:
dependency: transitive
description:
name: lints
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
source: hosted
version: "5.1.1"
matcher:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.15.0"
mime:
dependency: transitive
description:
name: mime
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
path:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
url: "https://pub.dev"
source: hosted
version: "2.2.15"
path_provider_aurora:
dependency: transitive
description:
path: "packages/path_provider_aurora"
ref: "aurora-path_provider_aurora-0.6.0"
resolved-ref: "82e13309171cb454aae989dbbde477282dfa7e20"
url: "https://gitlab.com/omprussia/flutter/packages.git"
source: git
version: "0.6.0"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
petitparser:
dependency: transitive
description:
name: petitparser
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
url: "https://pub.dev"
source: hosted
version: "6.0.2"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
posix:
dependency: transitive
description:
name: posix
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
url: "https://pub.dev"
source: hosted
version: "6.0.1"
services_aurora:
dependency: transitive
description:
path: "."
ref: "aurora-0.9.0"
resolved-ref: b8881eadd9081a04380496b20867feb45b1225e2
url: "https://gitlab.com/omprussia/flutter/flutter-community-plugins/services_aurora.git"
source: git
version: "0.9.0"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev"
source: hosted
version: "1.12.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev"
source: hosted
version: "2.1.2"
stream_transform:
dependency: transitive
description:
name: stream_transform
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
url: "https://pub.dev"
source: hosted
version: "2.1.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev"
source: hosted
version: "0.7.3"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev"
source: hosted
version: "14.3.0"
web:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xml:
dependency: transitive
description:
name: xml
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
url: "https://pub.dev"
source: hosted
version: "6.5.0"
sdks:
dart: ">=3.6.0 <4.0.0"
flutter: ">=3.27.0"
# SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
name: flutter_image_picker_aurora_example
description: "Demonstrates how to use the flutter_image_picker_aurora plugin."
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: ^3.6.0
dependencies:
flutter:
sdk: flutter
image_picker: ^1.1.2
flutter_image_picker_aurora:
path: ../
cupertino_icons: ^1.0.8
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^5.0.0
flutter:
uses-material-design: true
// SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
enum CameraScreenType { photo, video }
class CameraScreen extends StatefulWidget {
const CameraScreen({
super.key,
required this.type,
});
final CameraScreenType type;
// Select path any pages
static XFile? _file;
static void clear() {
CameraScreen._file = null;
}
static XFile? getResult() {
return CameraScreen._file;
}
@override
State<CameraScreen> createState() => _SelectorScreenState();
}
class _SelectorScreenState extends State<CameraScreen> {
late CameraController _controller;
late List<CameraDescription> _cameras;
bool _loading = true;
@override
void initState() {
super.initState();
_initCamera().then((_) {
setState(() {
_loading = false;
});
}).catchError((_) {
throw Exception("Error init camera");
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
void setState(VoidCallback fn) {
if (!mounted) return;
super.setState(fn);
}
Future<void> _initCamera() async {
_cameras = await availableCameras();
if (_cameras.isEmpty) {
throw Future.error('No cameras found.');
}
_controller = CameraController(_cameras[0], ResolutionPreset.max);
await _controller.initialize();
}
Future<void> _flipCamera() async {
setState(() => _loading = true);
await _controller.setDescription(_cameras.firstWhere((camera) => camera.name != _controller.description.name));
setState(() => _loading = false);
}
Future<XFile?> _takePhoto() async {
setState(() => _loading = true);
final picture = await _controller.takePicture();
final bytes = await picture.readAsBytes();
final directory = await getExternalStorageDirectories(type: StorageDirectory.pictures);
final fileName = '${DateTime.now().millisecondsSinceEpoch}.jpg';
final file = await File(p.join(directory![0].path, fileName)).writeAsBytes(bytes);
setState(() => _loading = false);
return XFile(file.path);
}
Future<void> _startRecordVideo() async {
if (!_controller.value.isRecordingVideo) {
setState(() => _loading = true);
await _controller.startVideoRecording();
setState(() => _loading = false);
}
}
Future<XFile?> _stopRecordVideo() async {
setState(() => _loading = true);
if (_controller.value.isRecordingVideo) {
final file = await _controller.stopVideoRecording();
setState(() => _loading = false);
return file;
} else {
throw Exception('The recording has already stopped.');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
if (CameraScreen._file != null)
Padding(
padding: EdgeInsets.only(right: 8.0),
child: IconButton(
icon: const Icon(Icons.done),
tooltip: 'Done',
onPressed: () => Navigator.pop(context),
),
)
],
),
body: SizedBox.expand(
child: Container(
color: Colors.black,
child: Center(
child: _loading ? const Center(child: CircularProgressIndicator()) : cameraPreview(),
),
),
),
);
}
Widget cameraPreview() {
return Stack(
children: [
Center(child: _controller.buildPreview()),
Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
const Spacer(),
if (_controller.value.isRecordingVideo) controlsVideoRecording() else controlsPreview()
],
),
),
],
);
}
Widget controlsPreview() {
return Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton.filled(
onPressed: _flipCamera,
icon: const Icon(Icons.flip_camera_ios),
),
const Spacer(),
if (widget.type == CameraScreenType.video)
IconButton.outlined(
onPressed: _startRecordVideo,
icon: const Icon(Icons.radio_button_checked),
color: Theme.of(context).colorScheme.primary,
style: OutlinedButton.styleFrom(
side: BorderSide(
width: 2.0,
color: Theme.of(context).colorScheme.primary,
),
),
),
if (widget.type == CameraScreenType.photo)
IconButton.filled(
onPressed: () async {
CameraScreen._file = await _takePhoto();
},
icon: const Icon(Icons.photo_camera),
),
],
);
}
Widget controlsVideoRecording() {
return Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
const Spacer(),
// Button stop record video
IconButton.outlined(
onPressed: () async {
CameraScreen._file = await _stopRecordVideo();
},
icon: const Icon(Icons.stop_circle),
color: Colors.red,
style: OutlinedButton.styleFrom(
side: const BorderSide(
width: 2.0,
color: Colors.red,
),
),
),
],
);
}
}
// SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import "package:ffi/ffi.dart";
import 'package:flutter_image_picker_aurora/ffi/flutter_image_picker_aurora_lib_bindings.dart';
import 'package:flutter_image_picker_aurora/ffi/response_model.dart';
import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
import 'package:services_aurora/services_aurora.dart';
/// Get data folders
Future<ResponseModel?> resizeImages({
required List<XFile> files,
required double? maxWidth,
required double? maxHeight,
required int? imageQuality,
}) =>
using((Arena arena) async {
// To char
final cRequest = json
.encode({
'maxHeight': maxHeight,
'maxWidth': maxWidth,
'imageQuality': imageQuality,
'filePaths': files.map((e) => e.path).toList(),
})
.toNativeUtf8()
.cast<Char>();
// Method Execution
final pointer = _bindings.resize_images(cRequest);
// Free memory
arena.using(cRequest, calloc.free);
// Returning the result
final data = pointer.cast<Utf8>().toDartString();
if (data == '') {
return null;
}
return ResponseModel.fromJson(jsonDecode(data));
});
const String _libName = 'flutter_image_picker_aurora_lib';
/// The dynamic library in which the symbols for [ExampleRustBindings] can be found.
final DynamicLibrary _dylib = () {
ServicesAurora.registerWith();
if (ServicesAurora.isAurora) {
return DynamicLibrary.open('lib$_libName.so');
}
throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');
}();
/// The bindings to the native functions in [_dylib].
final FlutterImagePickerLib _bindings = FlutterImagePickerLib(_dylib);
Это отличие свёрнуто
import 'dart:convert';
/// Base response model
class ResponseModel {
late bool state;
final List<ResponseFileModel> files = [];
ResponseModel.fromJson(Map<String, dynamic> json) {
if (![json.containsKey("state"), json.containsKey("files")].firstWhere((k) => !k, orElse: () => true)) {
throw Exception("Error parse json.");
}
state = json['state'];
(json["files"] as List).map((e) => ResponseFileModel.fromJson(e)).forEach((e) => files.add(e));
}
@override
String toString() {
return jsonEncode({
"state": state,
"files": files,
});
}
}
/// File output data
class ResponseFileModel {
late String name;
late String path;
late String mime;
late int length;
late DateTime lastModified;
ResponseFileModel.fromJson(Map<String, dynamic> json) {
if (![
json.containsKey("name"),
json.containsKey("path"),
json.containsKey("mime"),
json.containsKey("length"),
json.containsKey("last_modified"),
].firstWhere((k) => !k, orElse: () => true)) {
throw Exception("Error parse json.");
}
name = json['name'];
path = json['path'];
mime = json['mime'];
length = json['length'];
lastModified = DateTime.fromMillisecondsSinceEpoch((json['last_modified'] as int) * 1000);
}
@override
String toString() {
return jsonEncode({
"name": name,
"path": path,
"mime": mime,
"length": length,
"lastModified": lastModified,
});
}
}
// SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:file_selector/file_selector.dart';
import 'package:flutter/material.dart';
import 'package:flutter_image_picker_aurora/camera_screen.dart';
import 'package:flutter_image_picker_aurora/ffi/flutter_image_picker_aurora_lib.dart';
import 'package:flutter_selector_aurora/flutter_selector_aurora.dart';
import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
/// An implementation of [ImagePickerPlatform] for Aurora.
class FlutterImagePickerAurora extends ImagePickerPlatform {
/// Registers the Aurora implementation.
static void registerWith() {
ImagePickerPlatform.instance = FlutterImagePickerAurora();
}
/// Context is required to implement the Flutter plugin
///
/// ```dart
/// final navigatorKey = GlobalKey<NavigatorState>();
///
/// MaterialApp(
/// navigatorKey: navigatorKey,
/// );
/// ```
static GlobalKey<NavigatorState>? _key;
/// Set navigation global key
static void setGlobalKey(GlobalKey<NavigatorState> key) {
_key = key;
FlutterSelectorAurora.setGlobalKey(key);
}
/// Get current context
static BuildContext get _context {
if (_key?.currentContext == null) {
throw Exception("You haven't provided the context.");
}
return _key!.currentContext!;
}
/// BMP, GIF, ICO, JPEG, PNG, WebP
final mimeImages = <String>[
'image/bmp',
'image/gif',
'image/x-icon',
'image/jpeg',
'image/png',
'image/webp',
];
final mimeVideos = <String>[
// avi
'application/x-troff-msvideo',
'video/avi',
'video/msvideo',
'video/x-msvideo',
// mov
'video/quicktime',
'video/x-quicktime',
'image/mov',
'audio/aiff',
'audio/x-midi',
'audio/x-wav',
// mp4
'video/mp4',
'application/mp4',
// ogg
'audio/ogg',
'video/ogg',
// wmv
'video/x-ms-wmv',
'video/x-ms-asf',
// webm
'video/webm',
'audio/webm',
];
/// Pick image
/// Pick image with resize
/// Capture photo
@override
Future<XFile?> getImageFromSource({
required ImageSource source,
ImagePickerOptions options = const ImagePickerOptions(),
}) async {
if (source == ImageSource.camera) {
return await _openCamera(CameraScreenType.photo);
} else {
final file = await openFile(acceptedTypeGroups: [
XTypeGroup(
label: 'images',
mimeTypes: mimeImages,
)
]);
if (file == null) {
return null;
}
final imagesResized = await _resizeImage(
files: [file], maxWidth: options.maxWidth, maxHeight: options.maxHeight, imageQuality: options.imageQuality);
return imagesResized.isEmpty ? null : imagesResized.firstOrNull;
}
}
/// Pick images
@override
Future<List<XFile>> getMultiImageWithOptions({
MultiImagePickerOptions options = const MultiImagePickerOptions(),
}) async {
FlutterSelectorAurora.setLimit(options.limit);
final files = await openFiles(acceptedTypeGroups: [
XTypeGroup(
label: 'images',
mimeTypes: mimeImages,
)
]);
FlutterSelectorAurora.setLimit(null);
final imagesResized = await _resizeImage(
files: files,
maxWidth: options.imageOptions.maxWidth,
maxHeight: options.imageOptions.maxHeight,
imageQuality: options.imageOptions.imageQuality);
return imagesResized;
}
/// Pick image or video
/// Pick images or videos
@override
Future<List<XFile>> getMedia({
required MediaOptions options,
}) async {
List<XFile> images = [];
List<XFile> videos = [];
if (options.allowMultiple) {
FlutterSelectorAurora.setLimit(options.limit);
final files = await openFiles(acceptedTypeGroups: [
XTypeGroup(
label: 'media',
mimeTypes: mimeImages + mimeVideos,
)
]);
FlutterSelectorAurora.setLimit(null);
for (final file in files) {
if (mimeImages.contains(file.mimeType)) {
images.add(file);
} else {
videos.add(file);
}
}
} else {
final file = await openFile(acceptedTypeGroups: [
XTypeGroup(
label: 'media',
mimeTypes: mimeImages + mimeVideos,
)
]);
if (file == null) {
return [];
}
if (mimeImages.contains(file.mimeType)) {
images.add(file);
} else {
videos.add(file);
}
}
final imagesResized = await _resizeImage(
files: images,
maxWidth: options.imageOptions.maxWidth,
maxHeight: options.imageOptions.maxHeight,
imageQuality: options.imageOptions.imageQuality);
return imagesResized + videos;
}
/// Pick video
/// Capture video
@override
Future<XFile?> getVideo({
required ImageSource source,
CameraDevice preferredCameraDevice = CameraDevice.rear,
Duration? maxDuration,
}) async {
if (source == ImageSource.camera) {
return await _openCamera(CameraScreenType.video);
} else {
return openFile(acceptedTypeGroups: [
XTypeGroup(
label: 'videos',
mimeTypes: mimeVideos,
)
]);
}
}
/// Resize image options
Future<List<XFile>> _resizeImage({
required List<XFile>? files,
required double? maxWidth,
required double? maxHeight,
required int? imageQuality,
}) async {
if (files == null) {
return [];
}
if (maxWidth == null && maxHeight == null) {
return files;
}
final result = await resizeImages(
files: files,
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: imageQuality,
);
if (result == null || result.state == false) {
throw StateError('Failed to modify data');
}
List<XFile>? resultFiles = [];
for (final file in result.files) {
resultFiles.add(XFile(
file.path,
mimeType: file.mime,
name: file.name,
length: file.length,
lastModified: file.lastModified,
));
}
return resultFiles;
}
/// Camera screen
Future<XFile?> _openCamera(CameraScreenType type) async {
try {
CameraScreen.clear();
await Navigator.of(_context).push(MaterialPageRoute(builder: (context) => CameraScreen(type: type)));
return CameraScreen.getResult();
} catch (e) {
return null;
}
}
}
# SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
name: flutter_image_picker_aurora
description: "A Flutter plugin for picking images from the image library, and taking new pictures with the camera."
version: 0.0.1
publish_to: 'none'
environment:
sdk: ^3.6.0
flutter: '>=3.3.0'
dependencies:
ffi: ^2.1.3
flutter:
sdk: flutter
intl: ^0.20.2
plugin_platform_interface: ^2.0.2
image_picker_platform_interface: ^2.10.0
path: ^1.9.0
path_provider: ^2.0.15
path_provider_aurora:
git:
url: https://gitlab.com/omprussia/flutter/packages.git
ref: aurora-path_provider_aurora-0.6.0
path: packages/path_provider_aurora
camera: ^0.11.0+2
camera_aurora:
git:
url: https://gitlab.com/omprussia/flutter/packages.git
ref: aurora-camera_aurora-0.6.0
path: packages/camera_aurora
file_selector: ^1.0.3
flutter_selector_aurora:
git:
url: https://gitlab.com/omprussia/flutter/flutter-community-plugins/pickers_aurora.git
ref: aurora-flutter_selector_aurora-0.0.1
path: packages/flutter_selector_aurora
services_aurora:
git:
url: https://gitlab.com/omprussia/flutter/flutter-community-plugins/services_aurora.git
ref: aurora-0.9.0
dev_dependencies:
ffigen: ^13.0.0
flutter_test:
sdk: flutter
flutter_lints: ^5.0.0
ffigen:
name: FlutterImagePickerLib
description: Bindings for `rust c library`.
output: 'lib/ffi/flutter_image_picker_aurora_lib_bindings.dart'
headers:
entry-points:
- 'src/flutter_image_picker_aurora_lib.h'
flutter:
plugin:
platforms:
aurora:
dartPluginClass: FlutterImagePickerAurora
ffiPlugin: true
/**
* SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
/**
* Main function
*/
char *resize_images(const char *request);
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "adler2"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
[[package]]
name = "autocfg"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "bit_field"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bytemuck"
version = "1.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "color_quant"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "crc32fast"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
[[package]]
name = "either"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "exr"
version = "1.73.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0"
dependencies = [
"bit_field",
"half",
"lebe",
"miniz_oxide",
"rayon-core",
"smallvec",
"zune-inflate",
]
[[package]]
name = "fdeflate"
version = "0.3.5"
source = "git+https://github.com/image-rs/fdeflate?tag=v0.3.5#e16928adc9496537794ce9ae93a55558b45db77a"
dependencies = [
"simd-adler32",
]
[[package]]
name = "flate2"
version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
name = "flutter_image_picker_aurora_lib"
version = "0.0.1"
dependencies = [
"image",
"imagesize",
"libc",
"mime_guess",
"serde",
"serde_json",
]
[[package]]
name = "gif"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
dependencies = [
"color_quant",
"weezl",
]
[[package]]
name = "half"
version = "2.2.1"
source = "git+https://github.com/starkat99/half-rs?tag=v2.2.1#4c56dab175e41faaa367bae9eba82c555f002859"
dependencies = [
"crunchy",
]
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "image"
version = "0.24.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23"
dependencies = [
"bytemuck",
"byteorder",
"color_quant",
"exr",
"gif",
"jpeg-decoder",
"num-traits",
"png",
"qoi",
"tiff",
]
[[package]]
name = "imagesize"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285"
[[package]]
name = "itoa"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "jpeg-decoder"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
dependencies = [
"rayon",
]
[[package]]
name = "lebe"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "libc"
version = "0.2.163"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fdaeca4cf44ed4ac623e86ef41f056e848dbeab7ec043ecb7326ba300b36fd0"
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "mime"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "mime_guess"
version = "2.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
dependencies = [
"mime",
"unicase",
]
[[package]]
name = "miniz_oxide"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
dependencies = [
"adler2",
"simd-adler32",
]
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "png"
version = "0.17.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
dependencies = [
"bitflags",
"crc32fast",
"fdeflate",
"flate2",
"miniz_oxide",
]
[[package]]
name = "proc-macro2"
version = "1.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
dependencies = [
"unicode-ident",
]
[[package]]
name = "qoi"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
dependencies = [
"bytemuck",
]
[[package]]
name = "quote"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rayon"
version = "1.7.0"
source = "git+https://github.com/rayon-rs/rayon?tag=v1.7.0#6236214d717694917e77aa1c16d91176b9bc2fff"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.11.0"
source = "git+https://github.com/rayon-rs/rayon?tag=v1.7.0#6236214d717694917e77aa1c16d91176b9bc2fff"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-utils",
"num_cpus",
]
[[package]]
name = "ryu"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]]
name = "serde"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.138"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
]
[[package]]
name = "simd-adler32"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
name = "smallvec"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
[[package]]
name = "syn"
version = "2.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "tiff"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
dependencies = [
"flate2",
"jpeg-decoder",
"weezl",
]
[[package]]
name = "unicase"
version = "2.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
[[package]]
name = "unicode-ident"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]]
name = "weezl"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
[[package]]
name = "zune-inflate"
version = "0.2.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
dependencies = [
"simd-adler32",
]
# SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
[package]
name = "flutter_image_picker_aurora_lib"
version = "0.0.1"
edition = "2021"
rust-version = "1.61.0"
[lib]
name = "flutter_image_picker_aurora_lib"
crate-type = ["cdylib"]
[profile.release]
opt-level = "z"
strip = true
lto = true
codegen-units = 1
panic = "abort"
[dependencies]
libc = "=0.2.163"
image = "=0.24.8"
imagesize = "0.13.0"
mime_guess = "2.0.5"
serde_json = "1.0.136"
serde = { version = "1.0.217", features = ["derive"] }
[patch.crates-io]
# fix image for 1.61.0
rayon = { git = "https://github.com/rayon-rs/rayon", tag = "v1.7.0" }
rayon-core = { git = "https://github.com/rayon-rs/rayon", tag = "v1.7.0" }
half = { git = "https://github.com/starkat99/half-rs", tag = "v2.2.1" }
fdeflate = { git = "https://github.com/image-rs/fdeflate", tag = "v0.3.5" }
# flutter_image_picker_aurora_lib
Rust library for flutter_selector_aurora.
### Build
```shell
./release.sh
```
# SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
language = "C"
#!/bin/bash
# SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
###################################
## Build Rust with PSDK all targets
###################################
# Install Rust & Cargo
# $PSDK_DIR/sdk-chroot sb2 -t {target_psdk} -m sdk-install -R zypper in -y cargo
NAME='flutter_image_picker_aurora_lib'
source ~/.bashrc
export HOME=$HOME/.cargo_psdk
# Folder lib
dir=$(dirname -- "$0")
cd $dir
# Get psdk targets
# $PSDK_DIR/sdk-chroot sdk-assistant list
targets_psdk=$(ls $PSDK_DIR/../../targets | grep -v default | grep -i aurora)
# Get targets rust
# $PSDK_DIR/sdk-chroot sb2 -t $TARGET rustup target list
declare -A targets_rust
targets_rust['armv7hl']='armv7-unknown-linux-gnueabihf' # armv7-unknown-linux-gnueabi
targets_rust['aarch64']='aarch64-unknown-linux-gnu'
targets_rust['x86_64']='x86_64-unknown-linux-gnu'
# Gen headers
# psdk - requires rustc 1.63 or newer
cargo install cbindgen
cbindgen . -o ../$NAME.h
LICENSE=$(cat << SPDX
/**
* SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
* SPDX-License-Identifier: BSD-3-Clause
*/
SPDX
)
echo -e "$LICENSE\n$(cat ../$NAME.h)" > ../$NAME.h
# Clear old build
rm -rf target
build() {
target_psdk=$1
target_rust=$2
arch=$3
# Check exist
if [ -f "builds/$arch/lib$NAME.so" ]; then
echo "> info:"
echo "The assembly '$arch' is already there."
echo "==============="
return 0
fi
# Start
echo "Build $target_psdk..."
sleep 1
# Install
$PSDK_DIR/sdk-chroot sb2 -t $target_psdk rustup target add $target_rust
# Build
$PSDK_DIR/sdk-chroot sb2 -t $target_psdk cargo build --release --target $target_rust --verbose -j 1
# Copy
if [ -f "target/$target_rust/release/lib$NAME.so" ]; then
mkdir -p builds/$arch
cp target/$target_rust/release/lib$NAME.so builds/$arch/lib$NAME.so
fi
}
# Build all targets
for target in $targets_psdk
do
arch=${target##*-}
build $target ${targets_rust["$arch"]} $arch
done
# SPDX-FileCopyrightText: Copyright 2025 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
[toolchain]
channel = "stable"
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать