【问题标题】:Is it possible to share both text and a photo from Flutter image_picker using flutter_share or another share plugin?是否可以使用 flutter_share 或其他共享插件从 Flutter image_picker 共享文本和照片?
【发布时间】:2020-06-04 05:19:08
【问题描述】:

使用 flutter_share 插件,我可以在 Flutter ListView 中成功地共享来自我的 firestore 集合的文本:

child: IconButton(
icon: Icon(
  Icons.share,
   onPressed: () => Share.share(
   '${(snapshot.data.documents[index]['title'])}',
       ))),

我现在向 ListView 添加了一个新的 Flutter listtile 部分,其中包括来自 image_picker 插件的照片,用户可以在其中从他们的图库中选择一张照片或拍摄一张新照片并将其附加到 firestore 数据文本下方。

 void _openImagePicker(BuildContext context) {
 showModalBottomSheet(context: context, builder: (BuildContext context) {
   return Container(
     height: 180.0,
     padding: EdgeInsets.all(10.0),
   child: Column(
     children: [
     Text('Choose photo',
       style:TextStyle(fontWeight: FontWeight.bold),),
       SizedBox(height: 10.0),
       FlatButton(
         textColor: Theme.of(context).primaryColor,
         child: Text('Use Camera'),
       onPressed: () {
           _getImage(context, ImageSource.camera);
       },),
       FlatButton(
         textColor: Theme.of(context).primaryColor,child:
       Text('Open Gallery'),
         onPressed: () {
           _getImage(context, ImageSource.gallery);
         },),

     ]
   ),);
 });
 }
 @override
 Widget build(BuildContext context) {
 return Column(
   children: <Widget>[
     OutlineButton(
     onPressed: () {
       _openImagePicker(context);
     },
     child:Row(
         mainAxisAlignment: MainAxisAlignment.start,
         children: <Widget>[
           Icon(Icons.camera_alt),
           SizedBox(
             width:1.0,
           ),
           // Text('Add Image'),
         ]
     ),//Row
 ),//outline button

    SizedBox(height: 10.0),
     _imageFile == null ?  Text('Add an Image') : Image.file(_imageFile,
         fit: BoxFit.cover,
         height: 200.0,
      width: 200.0,       
       alignment: Alignment.topCenter,
     ),
   ],
 );}}

我的问题是,这个flutter_share插件或其他插件有没有办法将新图像与原始共享的firestore文本结合起来,这样用户就可以共享文本和组合的照片,而不仅仅是文本?还是只能发送一个或另一个?

图像不会存储在 Firestore 中,只有文本,因此可以使用用户的相机拍摄图像或从他们的图库上传,然后附加到共享文本中。


这是添加了 esys 共享的完整代码,它不发送 image_picker 图像

class ImageInput extends StatefulWidget {


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

class _ImageInputState extends State<ImageInput> {


  File _imageFile;

  void _getImage(BuildContext context, ImageSource source){
   ImagePicker.pickImage(source: source, maxWidth: 200.0).then((File image){
   setState((){
    _imageFile = image;
  //        _imageFile = await ImagePicker.pickImage(source: source);
  //        List<int> imageBytes = await _imageFile.readAsBytes();
  //        var uint8List = Uint8List.fromList(imageBytes);


  });
  Navigator.pop(context);

  });
 }


  void _openImagePicker(BuildContext context) {

  showModalBottomSheet(context: context, builder: (BuildContext context) {
  return Container(
    height: 180.0,
    padding: EdgeInsets.all(10.0),
  child: Column(
    children: [
    Text('Choose photo',
      style:TextStyle(fontWeight: FontWeight.bold),),
      SizedBox(height: 10.0),
      FlatButton(
        textColor: Theme.of(context).primaryColor,
        child: Text('Use Camera'),
      onPressed: () {
          _getImage(context, ImageSource.camera);
      },),
      FlatButton(
        textColor: Theme.of(context).primaryColor,child:
      Text('Open Gallery'),
        onPressed: () {
          _getImage(context, ImageSource.gallery);
        },)

    ]
  ),);
 });
 }


 @override
 Widget build(BuildContext context) {
 return Column(
 children: <Widget>[
    OutlineButton(
    onPressed: () {
      _openImagePicker(context);
    },
    child:Row(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          Icon(Icons.camera_alt),
          SizedBox(
            width:1.0,
          ),
          // Text('Add Image'),
        ]
    ),//Row
  ),//outline button

   SizedBox(height: 10.0),
    _imageFile == null ?  Text('Add an Image') : Image.file(_imageFile,
        fit: BoxFit.cover,
        height: 200.0,
     width: 200.0,
     // width: MediaQuery.of(context).size.width,
      alignment: Alignment.topCenter,
    ),

    MaterialButton(
      child: Text('Share mixed'),
      onPressed: () async => await _shareMixed(),
    ),

  ],
);
}
}


Future<void> _shareMixed() async {
try {
final ByteData bytes1 = await rootBundle.load('_imageFile');
//final ByteData bytes2 = await rootBundle.load('assets/image2.png');
// final ByteData bytes3 = await rootBundle.load('assets/addresses.csv');

await Share.files(
    'esys images',
    {
      '_imageFile': bytes1.buffer.asUint8List(),
      //'bluedan.png': bytes2.buffer.asUint8List(),
      //'addresses.csv': bytes3.buffer.asUint8List(),
    },
    '*/*',
    text: 'My optional text.');
} catch (e) {
print('error: $e');
}
}

【问题讨论】:

    标签: listview flutter share flutter-dependencies


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    你可以使用包https://pub.dev/packages/esys_flutter_share

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    import 'dart:io';
    import 'package:esys_flutter_share/esys_flutter_share.dart';
    import 'dart:typed_data';
    
    class ImageInput extends StatefulWidget {
      @override
      _ImageInputState createState() => _ImageInputState();
    }
    
    class _ImageInputState extends State<ImageInput> {
      File _imageFile;
    
      void _getImage(BuildContext context, ImageSource source) {
        ImagePicker.pickImage(source: source, maxWidth: 200.0).then((File image) {
          setState(() {
            _imageFile = image;
            //        _imageFile = await ImagePicker.pickImage(source: source);
            //        List<int> imageBytes = await _imageFile.readAsBytes();
            //        var uint8List = Uint8List.fromList(imageBytes);
          });
          Navigator.pop(context);
        });
      }
    
      Future<void> _shareImageAndText() async {
        try {
          List<int> imageBytes = await _imageFile.readAsBytes();
          var uint8List = Uint8List.fromList(imageBytes);
          await Share.file('esys image', 'esys.jpg', uint8List, 'image/jpeg',
              text: 'My optional text.');
        } catch (e) {
          print('error: $e');
        }
      }
    
      void _openImagePicker(BuildContext context) {
        showModalBottomSheet(
            context: context,
            builder: (BuildContext context) {
              return Container(
                height: 180.0,
                padding: EdgeInsets.all(10.0),
                child: Column(children: [
                  Text(
                    'Choose photo',
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  SizedBox(height: 10.0),
                  FlatButton(
                    textColor: Theme.of(context).primaryColor,
                    child: Text('Use Camera'),
                    onPressed: () {
                      _getImage(context, ImageSource.camera);
                    },
                  ),
                  FlatButton(
                    textColor: Theme.of(context).primaryColor,
                    child: Text('Open Gallery'),
                    onPressed: () {
                      _getImage(context, ImageSource.gallery);
                    },
                  )
                ]),
              );
            });
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          children: <Widget>[
            OutlineButton(
              onPressed: () {
                _openImagePicker(context);
              },
              child: Row(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                    Icon(Icons.camera_alt),
                    SizedBox(
                      width: 1.0,
                    ),
                    // Text('Add Image'),
                  ]), //Row
            ), //outline button
    
            SizedBox(height: 10.0),
            _imageFile == null
                ? Text('Add an Image')
                : Image.file(
                    _imageFile,
                    fit: BoxFit.cover,
                    height: 200.0,
                    width: 200.0,
                    // width: MediaQuery.of(context).size.width,
                    alignment: Alignment.topCenter,
                  ),
    
            MaterialButton(
              child: Text('Share mixed'),
              onPressed: () async => await _shareImageAndText(),
            ),
          ],
        );
      }
    }
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                ImageInput(),
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    【讨论】:

    • 它与原始共享包 package:share/share.dart 冲突,并且仅启用 esys 会返回仅文本共享的错误 - Share.text('my text title', 'This is my text与其他应用程序共享。', 'text/plain');
    • 我会用什么来代替图像 'eyse.png',因为我从 image_picker 获取图像 - 它只是我的变量 '_imageFile' 吗?
    • onPressed: () async => await _shareMixed(),也不适用于我的 IconButton。有没有更好的例子可以用来修改我的代码?因为它现在是不可用的。
    • 这个包好像有bug。
    • 所以不能分享图片,只能分享文字?我开始希望我从未听说过颤振,而是学到了其他东西。颤振中的一切都有错误。
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多