Browse Source

clean library

master
daivph 5 years ago
parent
commit
5fcc02d92d
7 changed files with 5 additions and 594 deletions
  1. +1
    -1
      ios/Flutter/.last_build_id
  2. +0
    -6
      ios/Podfile.lock
  3. +3
    -0
      ios/Runner.xcodeproj/project.pbxproj
  4. +0
    -1
      lib/presentation/custom_widgets/camera_helper.dart
  5. +0
    -554
      lib/presentation/custom_widgets/widget_media_helper.dart
  6. +1
    -24
      pubspec.lock
  7. +0
    -8
      pubspec.yaml

+ 1
- 1
ios/Flutter/.last_build_id View File

@@ -1 +1 @@
eb141365fb69a4e0decadd2584d53516
9bc44f1c3b7333c5e0a0fdfe009c8f40

+ 0
- 6
ios/Podfile.lock View File

@@ -107,8 +107,6 @@ PODS:
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (6.7.2):
- GoogleUtilities/Logger
- image_picker (0.0.1):
- Flutter
- MTBBarcodeScanner (5.0.11)
- nanopb (1.30906.0):
- nanopb/decode (= 1.30906.0)
@@ -145,7 +143,6 @@ DEPENDENCIES:
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- image_picker (from `.symlinks/plugins/image_picker/ios`)
- package_info (from `.symlinks/plugins/package_info/ios`)
- path_provider (from `.symlinks/plugins/path_provider/ios`)
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
@@ -190,8 +187,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_messaging/ios"
Flutter:
:path: Flutter
image_picker:
:path: ".symlinks/plugins/image_picker/ios"
package_info:
:path: ".symlinks/plugins/package_info/ios"
path_provider:
@@ -226,7 +221,6 @@ SPEC CHECKSUMS:
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GoogleDataTransport: e85fb700c9b027079ce182c3d08e12e0f9618bb4
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62

+ 3
- 0
ios/Runner.xcodeproj/project.pbxproj View File

@@ -385,6 +385,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.tpfarm;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -523,6 +524,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.tpfarm;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -555,6 +557,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 0.1.0;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.tpfarm;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

+ 0
- 1
lib/presentation/custom_widgets/camera_helper.dart View File

@@ -5,7 +5,6 @@ import 'package:farm_tpf/main.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:thumbnails/thumbnails.dart';
import 'package:video_player/video_player.dart';
import 'package:path_provider/path_provider.dart';


+ 0
- 554
lib/presentation/custom_widgets/widget_media_helper.dart View File

@@ -1,554 +0,0 @@
import 'dart:io';
import 'dart:async';

import 'package:farm_tpf/custom_model/Media.dart';
import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart';
import 'package:farm_tpf/presentation/custom_widgets/hoz_list_view.dart';
import 'package:farm_tpf/presentation/custom_widgets/shimmer_image.dart';
import 'package:farm_tpf/utils/const_color.dart';
import 'package:farm_tpf/utils/const_string.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get/get.dart';
import 'package:get/state_manager.dart';
import 'package:image_picker/image_picker.dart';
import 'package:video_player/video_player.dart';

class WidgetMediaHelper extends StatefulWidget {
final Function(List<String> filePaths) onChangeFiles;
WidgetMediaHelper({@required this.onChangeFiles});
@override
_WidgetMediaHelperState createState() => _WidgetMediaHelperState();
}

class _WidgetMediaHelperState extends State<WidgetMediaHelper> {
final globalScaffoldKey = GlobalKey<ScaffoldState>();
PickedFile _imageFile;
dynamic _pickImageError;
bool isVideo = false;
VideoPlayerController _controller;
VideoPlayerController _toBeDisposed;
String _retrieveDataError;

final ImagePicker _picker = ImagePicker();
List<Media> currentItems = [];
List<String> files = new List<String>();
var changeImageController = Get.put(ChangeImageController());
double imageWidth = 90;
double imageHeight = 90;

@override
void initState() {
super.initState();
changeImageController.initValue();
}

@override
Widget build(BuildContext context) {
return BlocProvider<MediaHelperBloc>(
create: (BuildContext contextA) =>
MediaHelperBloc()..add(ChangeListMedia(items: currentItems)),
child: BlocBuilder<MediaHelperBloc, MediaHelperState>(
builder: (contextB, state) {
if (state is MediaHelperFailure) {
return Container();
} else if (state is MediaHelperSuccess) {
return Container(
padding: EdgeInsets.all(8),
child: Column(
children: <Widget>[
SizedBox(
width: double.infinity,
height: 44,
child: FlatButton(
onPressed: () {
showDialog(
context: context,
barrierDismissible: true,
builder: (context) => Opacity(
child: multipleChoice(contextB),
opacity: 1,
));
},
color: COLOR_CONST.DEFAULT,
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(7.0),
),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.image, color: Colors.white),
SizedBox(
width: 8.0,
),
Text(
button_add_media,
style: TextStyle(
fontWeight: FontWeight.bold,
color: COLOR_CONST.WHITE),
)
],
),
)),
),
SizedBox(
height: 4.0,
),
Container(
height: 150,
child: _buildListPoster(),
),
defaultTargetPlatform == TargetPlatform.android
? FutureBuilder<void>(
future: retrieveLostData(context),
builder: (BuildContext context,
AsyncSnapshot<void> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return const Text(
'You have not yet picked an image.',
textAlign: TextAlign.center,
);
case ConnectionState.done:
return isVideo
? _previewVideo()
: _previewImage();
default:
if (snapshot.hasError) {
return Text(
'Pick image/video error: ${snapshot.error}}',
textAlign: TextAlign.center,
);
} else {
return const Text(
'You have not yet picked an image.',
textAlign: TextAlign.center,
);
}
}
},
)
: (isVideo ? _previewVideo() : _previewImage()),
],
));
}
return Container();
}));
}

_buildListPoster() {
return BlocBuilder<MediaHelperBloc, MediaHelperState>(
builder: (context, state) {
if (state is MediaHelperSuccess) {
return WrapContentHozListView(
itemBuilder: (context, index) {
var item = state.items[index];
return _WidgetItemMedia(
item: item,
deleteImage: (item) {
files.remove(item.pathFile);
currentItems.remove(item);
widget.onChangeFiles(files);
BlocProvider.of<MediaHelperBloc>(context)
.add(ChangeListMedia(items: currentItems));
});
},
separatorBuilder: (context, index) {
return SizedBox(width: 14);
},
list: state.items,
);
}
return Container();
});
}

Widget multipleChoice(BuildContext context) {
return CupertinoAlertDialog(
title: Text(label_title_select_media),
actions: <Widget>[
CupertinoDialogAction(
child: const Text(label_select_image_from_library),
onPressed: () {
Navigator.pop(context, 'Discard');
isVideo = false;
_onImageButtonPressed(ImageSource.gallery, context: context);
}),
CupertinoDialogAction(
child: const Text(label_take_photo),
onPressed: () {
Navigator.pop(context, 'Discard');
isVideo = false;
_onImageButtonPressed(ImageSource.camera, context: context);
}),
CupertinoDialogAction(
child: const Text(label_select_video_from_library),
onPressed: () {
Navigator.pop(context, 'Discard');
isVideo = true;
_onImageButtonPressed(ImageSource.gallery);
}),
CupertinoDialogAction(
child: const Text(label_record_video),
onPressed: () {
Navigator.pop(context, 'Discard');
isVideo = true;
_onImageButtonPressed(ImageSource.camera);
}),
CupertinoDialogAction(
child: const Text(label_cancel),
textStyle: TextStyle(fontWeight: FontWeight.bold),
isDefaultAction: true,
onPressed: () {
Navigator.pop(context, 'Cancel');
}),
],
);
}

Widget _actionButton() {
return BlocListener<MediaHelperBloc, MediaHelperState>(
listener: (context, state) {
SizedBox(
width: double.infinity,
height: 44,
child: FlatButton(
onPressed: () {
showDialog(
context: context,
barrierDismissible: true,
builder: (context) => Opacity(
child: Text(""),
opacity: 1,
));
},
color: COLOR_CONST.DEFAULT,
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(7.0),
),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.image, color: Colors.white),
SizedBox(
width: 8.0,
),
Text(
button_add_media,
style: TextStyle(
fontWeight: FontWeight.bold, color: COLOR_CONST.WHITE),
)
],
),
)),
);
});
}

Future<void> _playVideo(PickedFile file) async {
if (file != null && mounted) {
await _disposeVideoController();
File f = File(file.path);
_controller = VideoPlayerController.file(File(file.path));
await _controller.setVolume(1.0);
await _controller.initialize();
await _controller.setLooping(false);
await _controller.play();
}
}

_onImageButtonPressed(ImageSource source, {BuildContext context}) async {
if (_controller != null) {
await _controller.setVolume(0.0);
}
if (isVideo) {
// final video = await FilePicker.getFile(type: FileType.video);
final PickedFile pickedFile = await _picker.getVideo(source: source);
Get.find<ChangeImageController>().updateFile(pickedFile);
Media newMedia = Media()
..isVideo = false
..isServerFile = false
..pathFile = pickedFile.path;
currentItems.add(newMedia);
print(pickedFile.path);
files.add(pickedFile.path);
_playVideo(pickedFile);
// BlocProvider.of<MediaHelperBloc>(context)
// ..add(ChangeListMedia(items: currentItems));
// widget.onChangeFiles(files);
} else {
await _displayPickImageDialog(context,
(double maxWidth, double maxHeight, int quality) async {
try {
final pickedFile = await _picker.getImage(
source: source,
maxWidth: imageWidth,
maxHeight: imageHeight,
imageQuality: quality,
);

Get.find<ChangeImageController>().updateFile(pickedFile);
Media newMedia = Media()
..isVideo = false
..isServerFile = false
..pathFile = pickedFile.path;
currentItems.add(newMedia);
files.add(pickedFile.path);
BlocProvider.of<MediaHelperBloc>(context)
..add(ChangeListMedia(items: currentItems));
widget.onChangeFiles(files);
} catch (e) {
Get.find<ChangeImageController>().updateFileError(e);
}
});
}
;
}

@override
void deactivate() {
if (_controller != null) {
_controller.setVolume(0.0);
_controller.pause();
}
super.deactivate();
}

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

Future<void> _disposeVideoController() async {
if (_toBeDisposed != null) {
await _toBeDisposed.dispose();
}
_toBeDisposed = _controller;
_controller = null;
}

Widget _previewVideo() {
final Text retrieveError = _getRetrieveErrorWidget();
if (retrieveError != null) {
return retrieveError;
}
if (_controller == null) {
return const Text(
'You have not yet picked a video',
textAlign: TextAlign.center,
);
}
return Padding(
padding: const EdgeInsets.all(10.0),
child: AspectRatioVideo(_controller),
);
}

Widget _previewImage() {
return Builder(builder: (context) {
final Text retrieveError = _getRetrieveErrorWidget();
if (retrieveError != null) {
return retrieveError;
}
if (_imageFile != null) {
var imageResult =
Image.file(File(_imageFile.path), width: imageWidth, height: 100);
Media newMedia = Media()
..isVideo = false
..isServerFile = false
..pathFile = _imageFile.path;
currentItems.add(newMedia);
BlocProvider.of<MediaHelperBloc>(context)
.add(ChangeListMedia(items: currentItems));
//widget.onChangeFiles(files);
return Container(
child: Text("ok"),
);
} else if (_pickImageError != null) {
return Text(
'Pick image error: $_pickImageError',
textAlign: TextAlign.center,
);
} else {
return const Text(
'You have not yet picked an image.',
textAlign: TextAlign.center,
);
}
});
}

Future<void> retrieveLostData(
BuildContext context,
) async {
final LostData response = await _picker.getLostData();
if (response.isEmpty) {
return;
}
if (response.file != null) {
if (response.type == RetrieveType.video) {
isVideo = true;
await _playVideo(response.file);
} else {
isVideo = false;
setState(() {
_imageFile = response.file;
});
}
} else {
_retrieveDataError = response.exception.code;
}
}

Text _getRetrieveErrorWidget() {
if (_retrieveDataError != null) {
final Text result = Text(_retrieveDataError);
_retrieveDataError = null;
return result;
}
return null;
}

Future<void> _displayPickImageDialog(
BuildContext context, OnPickImageCallback onPick) async {
onPick(null, null, null);
}
}

typedef void OnPickImageCallback(
double maxWidth, double maxHeight, int quality);

class AspectRatioVideo extends StatefulWidget {
AspectRatioVideo(this.controller);

final VideoPlayerController controller;

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

class AspectRatioVideoState extends State<AspectRatioVideo> {
VideoPlayerController get controller => widget.controller;
bool initialized = false;

void _onVideoControllerUpdate() {
if (!mounted) {
return;
}
if (initialized != controller.value.initialized) {
initialized = controller.value.initialized;
setState(() {});
}
}

@override
void initState() {
super.initState();
controller.addListener(_onVideoControllerUpdate);
}

@override
void dispose() {
controller.removeListener(_onVideoControllerUpdate);
super.dispose();
}

@override
Widget build(BuildContext context) {
if (initialized) {
return Container(
width: 100,
height: 100,
child: AspectRatio(
aspectRatio: controller.value?.aspectRatio,
child: VideoPlayer(controller),
),
);
} else {
return Container();
}
}
}

class _WidgetItemMedia extends StatelessWidget {
ItemMediaCallback deleteImage;
final Media item;

_WidgetItemMedia({@required this.item, @required this.deleteImage});

BuildContext _context;

@override
Widget build(BuildContext context) {
_context = context;
return GestureDetector(
onTap: () {
print("Show preview image or video");
},
child: Stack(
alignment: Alignment.bottomCenter,
overflow: Overflow.visible,
children: <Widget>[
Positioned(
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: item.isServerFile
? ShimmerImage(
item.pathFile,
width: 93,
height: 124,
fit: BoxFit.cover,
)
: Image.file(File(item.pathFile), width: 100, height: 100),
)),
Positioned(
top: -5,
right: -5,
child: IconButton(
icon: Icon(
Icons.cancel,
color: Colors.redAccent,
),
onPressed: () {
print("On tap delete media");
deleteImage(item);
}),
)
],
));
}
}

typedef ItemMediaCallback = void Function(Media item);

class ItemMediaVM {
String photo;
bool isVideo;
Image image;

ItemMediaVM(this.photo, this.isVideo, this.image);
}

class ChangeImageController extends GetxController {
PickedFile _imageFile;
dynamic _pickImageError;
void initValue() {
update();
}

void updateFile(PickedFile imageFile) {
_imageFile = imageFile;
update();
}

void updateFileError(dynamic pickImageError) {
_pickImageError = pickImageError;
update();
}
}

+ 1
- 24
pubspec.lock View File

@@ -315,7 +315,7 @@ packages:
source: hosted
version: "1.4.0"
flutter_plugin_android_lifecycle:
dependency: "direct main"
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
@@ -401,22 +401,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.4"
image_picker:
dependency: "direct main"
description:
path: "packages/image_picker/image_picker"
ref: "9cac5347d9ab9d111a918a8154fb060565b1bf31"
resolved-ref: "9cac5347d9ab9d111a918a8154fb060565b1bf31"
url: "https://github.com/miguelpruivo/plugins"
source: git
version: "0.6.7+5"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
intl:
dependency: "direct main"
description:
@@ -800,13 +784,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.17"
thumbnails:
dependency: "direct main"
description:
name: thumbnails
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
timing:
dependency: transitive
description:

+ 0
- 8
pubspec.yaml View File

@@ -27,14 +27,7 @@ dependencies:
pattern_formatter: ^1.0.2
rxdart: ^0.23.0
barcode_scan: ^3.0.1
#https://github.com/flutter/plugins/pull/2860
image_picker:
git:
url: https://github.com/miguelpruivo/plugins
ref: 9cac5347d9ab9d111a918a8154fb060565b1bf31
path: packages/image_picker/image_picker
video_player: ^0.10.11+2
flutter_plugin_android_lifecycle: ^1.0.4
shimmer: ^1.1.1
font_awesome_flutter: ^8.8.1
package_info: ^0.4.3
@@ -50,7 +43,6 @@ dependencies:
camera: ^0.5.8+5
path_provider: ^1.6.14
file_picker: ^2.0.0
thumbnails: ^1.0.1
flutter_cache_manager: ^1.4.2

mime: ^0.9.7

Loading…
Cancel
Save