import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:path/path.dart' as Path; import 'package:provider/provider.dart'; import 'package:fcs/model/manual_model.dart'; import 'package:fcs/pages/manual/instruction_data_page.dart'; import 'package:fcs/vo/manual.dart'; import 'package:fcs/widget/img_file.dart'; import 'package:fcs/widget/local_text.dart'; import 'package:fcs/widget/progress.dart'; class SlideDataPage extends StatefulWidget { final ManualItem manItem; final int manIndex; SlideDataPage({this.manItem, this.manIndex}); @override _SlideDataPageState createState() => _SlideDataPageState(); } class _SlideDataPageState extends State { File slideImageFile; List slideList = []; List _initSlideList = []; File imageFile; File engImgFile; File mmImgFile; bool _isLoading = false; @override void initState() { super.initState(); } pickImageFromGallery(ImageSource source, ManualModel manualModel) async { File tempImage = await ImagePicker.pickImage( source: source, imageQuality: 80, maxWidth: 300); var fileName = Path.basename(tempImage.path); var path = '${manualModel.dataDir}'; File newImage = await tempImage.copy('$path/manual/img/$fileName'); var slideData = SlideData(id: slideList.length, image: fileName, instructions: []); setState(() { slideList.add(slideData); }); // manualModel.saveSlideData(widget.manIndex, slideList.length, slideData); } @override Widget build(BuildContext context) { var manualModel = Provider.of(context); slideList = manualModel.getSlideList(widget.manIndex); final engImgBox = Container( padding: EdgeInsets.only(left: 20), child: Column(children: [ Text('English image'), ImageFile( imageSource: ImageSource.gallery, enabled: true, title: "Image", onFile: (file) { engImgFile = file; }) ])); final mmImgBox = Container( padding: EdgeInsets.only(left: 20, top: 20), child: Column(children: [ Text('Myanmar image'), ImageFile( imageSource: ImageSource.gallery, enabled: true, title: "Image", onFile: (file) { mmImgFile = file; }), ])); final saveImages = Container( padding: EdgeInsets.only(left: 20, top: 20), child: FlatButton( onPressed: () { saveSlideImages(context, manualModel, widget.manIndex); }, child: Text('Save'))); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( title: Text('Slide Data'), ), body: Container( child: GridView.builder( itemCount: slideList.length, itemBuilder: (BuildContext context, int index) { return Card( child: InkWell( onTap: () => { Navigator.push( context, MaterialPageRoute( builder: (context) => InstructionDataPage( slideData: slideList[index], path: manualModel.dataDir, slideIndex: index, manIndex: widget.manIndex, ))) }, child: Container( child: Stack( fit: StackFit.expand, children: [ Image.file(File('${manualModel.dataDir}/manual/img/' + slideList[index].image)), Positioned( top: 0, right: 0, child: IconButton( icon: Icon(Icons.delete), onPressed: () { setState(() { manualModel.deleteSlideData( widget.manIndex, slideList[index]); }); }), ) ], ), ), ), ); }, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), ), ), floatingActionButton: FloatingActionButton( onPressed: () async => await _dialog( context, manualModel, engImgBox, mmImgBox, saveImages), tooltip: 'Pick Image', child: Icon(Icons.add), ), ), ); } Future _dialog(BuildContext context, ManualModel manualModel, Widget engImg, Widget mmImg, Widget saveImgs) { return showDialog( context: context, builder: (BuildContext context) { return AlertDialog( content: Container( child: Padding( padding: const EdgeInsets.all(8.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Column( mainAxisSize: MainAxisSize.min, children: [engImg, mmImg, saveImgs], ), ], ), ), ), ); }, ); } saveSlideImages( BuildContext context, ManualModel manualModel, int manIndex) async { var engFileName = Path.basename(engImgFile.path); var mmFileName = Path.basename(mmImgFile.path); var path = '${manualModel.dataDir}'; File engImage = await engImgFile.copy('$path/manual/img/$engFileName'); File mmImage = await mmImgFile.copy('$path/manual/img/$mmFileName'); var length = slideList.toList().length; var slideData; if (length == 0) { slideData = SlideData( id: 1, image: engFileName, imagemm: mmFileName, instructions: [], instructionsmm: []); } else { dynamic max = slideList.first; slideList.forEach((e) { if (e.id > max.id) max = e; }); slideData = SlideData( id: max.id + 1, image: engFileName, imagemm: mmFileName, instructions: [], instructionsmm: []); } manualModel.saveSlideData(manIndex, length, slideData); Navigator.pop(context); } }