Flutter中运用底部滑起组件调用手机相机和图库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1. 引入插件image_picker

在项目的配置文件pubspec.yaml中的环境依赖dependencies下引入插件image_picker,最新版本号可以从 https://pub.flutter-io.cn/ 网页查询。

dependencies:
  image_picker: ^0.6.7+17
  image_picker: ^0.8.6 #新版本

由于技术的更新换代非常快,每个版本相应的API均会有所更新,下面是官方文档中的新旧API的对比。对应链接:image_picker插件官方文档
在这里插入图片描述

2. showBottomMenu函数(^0.6.7+17版本)

showBottomMenu()函数可以用于某按钮或手势的onTap()、onPress()事件中调用,即可弹出从屏幕底部滑起组件并点击调用照相机和图库功能。

void showBottomMenu(context){
    showModalBottomSheet(context: context, builder: (context){
      return Container(
        height: 200,
        child: Column(
          children: [
            ListTile(
                title: Text('拍照',textAlign: TextAlign.center,style: TextStyle(fontSize: 19),),
                onTap: () async{
                  //takePhotoFromCamera();
                  final ImagePicker picker = new ImagePicker();
                  var image = await picker.getImage(source: ImageSource.camera);
                }),
            Divider(),
            ListTile(
                title: Text('从相册中选择',textAlign: TextAlign.center,style: TextStyle(fontSize: 19),),
                onTap: () async{
                  //print('00000');
                  //takePhotoFromGallery();
                  final ImagePicker picker = new ImagePicker();
                  var image = await picker.getImage(source: ImageSource.gallery);
                }),
            Divider(),
            ListTile(
                title: Text('取消',textAlign: TextAlign.center,style: TextStyle(fontSize: 19),),
                onTap: (){
                  Navigator.of(context).pop();//取消滑块的滑起
                })
          ],
        ),
      );
    });
  }

3. 调用照相机和图库的核心代码

调用照相机和图库的代码区别不大,区别在于getImage属性的参数,调用相机的参数为mageSource.camera,而调用相册的参数为ImageSource.gallery。

3.1 image_picker: ^0.6.7+17版本下

//调用手机相机
final ImagePicker picker = new ImagePicker();
var image = await picker.getImage(source: ImageSource.camera);

//调用手机相册
final ImagePicker picker = new ImagePicker();
var image = await picker.getImage(source: ImageSource.gallery);

3.2 image_picker: ^0.8.6版本下

final ImagePicker picker = new ImagePicker();
//var image = await picker.getImage(source: ImageSource.gallery);
final XFile? image = await picker.pickImage(source: ImageSource.gallery);
setState(() {
   imagePath = image;
});

3.3 完整代码

两个版本下的完整代码

Flutter,要在父组件调用组件,可以使用`Subclass`或者`Modal`的方式。在子组件,可以使用`StatefulWidget`和`StatelessWidget`配合使用来实现组件的重建。 如果你希望子组件在父组件调用时能够重建,你可以在子组件创建一个`StatefulWidget`,并在其定义一个`State`对象。当父组件调用组件时,Flutter会自动触发子组件的重建。 下面是一个简单的示例代码: ```dart import 'package:flutter/material.dart'; class ChildComponent extends StatefulWidget { @override _ChildComponentState createState() => _ChildComponentState(); } class _ChildComponentState extends State<ChildComponent> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Child Component')), body: Center( child: _counter > 0 ? Text(_counter.toString()) : Container(), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, child: Icon(Icons.add), ), ); } } class ParentComponent extends StatefulWidget { @override _ParentComponentState createState() => _ParentComponentState(); } class _ParentComponentState extends State<ParentComponent> { @override Widget build(BuildContext context) { return Scaffold( body: ChildComponent(), // 在这里调用组件Flutter会自动触发重建 ); } } ``` 在这个示例,当父组件调用组件时,Flutter会自动触发子组件的重建。你可以根据需要在子组件添加其他逻辑和状态管理。请注意,子组件的状态需要在父组件保持一致,以便在调用时能够正确重建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值