点击Android相机Flutter驱动程序

问题描述

我正在Flutter中进行集成测试,并且在应用程序中打开了相机,但是我不知道如何点击按钮来拍摄照片,有人知道如何搜索此按钮吗?

如果您可以在该应用中选择要使用相机拍摄照片还是选择图库图片的代码,则为以下代码

import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
import 'package:random_string/random_string.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'package:rosita/language/firebase_remote.dart';
import 'package:rosita/api/api_provider.dart';
import 'package:rosita/constants/common.dart';
import 'package:rosita/model/image_object.dart';
import 'package:rosita/model/senior_user.dart';
import 'package:rosita/modules/widgets/button_ui.dart';
import 'package:rosita/rosita.dart';

class AddProfileImageScreen extends StatefulWidget {
  const AddProfileImageScreen({Key key,this.seniorUser}) : super(key: key);

  final SeniorUser seniorUser;

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

class _AddProfileImageScreenState extends State<AddProfileImageScreen> {
  bool _isProcessing = false;
  File _image;
  bool _enableButton = false;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,body: ModalProgressHUD(
        inAsyncCall: _isProcessing,color: Colors.transparent,progressIndicator: const CircularProgressIndicator(
          strokeWidth: 2.0,),child: Container(
          padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),constraints: BoxConstraints(
              minHeight: MediaQuery.of(context).size.height,minWidth: MediaQuery.of(context).size.width),child: Padding(
            padding: const EdgeInsets.all(24),child: Column(
              mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
                darkSubtitleText('choose_profile_picture',context),Expanded(
                  child: Center(
                    child: SizedBox(
                      width: 100,height: 100,child: Card(
                        shape: RoundedRectangleBorder(
                          side: const BorderSide(
                            color: AppTheme.purpleColor,width: 4,borderRadius: BorderRadius.circular(60.0),elevation: 0,color: Theme.of(context).dividerColor,child: _image == null
                            ? (widget.seniorUser != null &&
                                    widget.seniorUser.profileImage != null &&
                                    widget.seniorUser.profileImage.imageUrl !=
                                        '')
                                ? CachedNetworkImage(
                                    imageUrl:
                                        widget.seniorUser.profileImage.imageUrl,placeholder:
                                        (BuildContext context,String url) =>
                                            Image.asset(ConstantsData.appIcon),errorWidget: (BuildContext context,String url,error) =>
                                        const Icon(Icons.error),fit: BoxFit.cover,)
                                : Image.asset(ConstantsData.appIcon)
                            : Image.file(_image),ButtonUI(
                  buttonName: 'ProfilePhotoFromCameraButton',key: const Key(Keys.cameraButton),isTrack: true,color: AppTheme.primaryColor,body: Center(
                    child: Padding(
                      padding: const EdgeInsets.all(16.0),child: Text(
                        FireText.of('take_a_photo_with_your_camera'),textAlign: TextAlign.center,style: Theme.of(context)
                            .primaryTextTheme
                            .subtitle2
                            .copyWith(
                              color: Theme.of(context).backgroundColor,onTap: () {
                    getImage(isGallery: false);
                  },verticalSpacer(),ButtonUI(
                  buttonName: 'ProfilePhotoFromGalleryButton',key: const Key(Keys.galleryButton),child: Text(
                        FireText.of('choose_from_gallery'),onTap: () {
                    getImage(isGallery: true);
                  },if (_image != null || _enableButton)
                  ButtonUI(
                    buttonName: 'ProfilePhotoUploadButton',key: const Key(Keys.uploadButton),color: AppTheme.purpleColor,body: Center(
                      child: Padding(
                        padding: const EdgeInsets.all(16.0),child: Text(
                          FireText.of('continue_txt'),style: Theme.of(context)
                              .primaryTextTheme
                              .subtitle2
                              .copyWith(
                                color: Theme.of(context).backgroundColor,onTap: () {
                      _uploadAllInformation();
                    },],);
  }

  Future<void> getImage({bool isGallery = true}) async {
    await <Permission>[Permission.camera,Permission.storage].request();
    if (await Permission.storage.status != PermissionStatus.granted) {
      setState(() {
        _enableButton = true;
      });
      return;
    }

    if (!isGallery &&
        await Permission.camera.status != PermissionStatus.granted) {
      setState(() {
        _enableButton = true;
      });
      return;
    }

    final image = await ImagePicker.pickImage(
        source: isGallery ? ImageSource.gallery : ImageSource.camera);

    if (image == null) return;

    final cropimage = await cropImage(image);
    if (cropimage == null) return;

    setState(() {
      _image = cropimage;
    });
  }

  Future<File> cropImage(File imageFile) async {
    final croppedFile = await ImageCropper.cropImage(
      androidUiSettings: AndroidUiSettings(
        statusBarColor: Theme.of(context).primaryColor,toolbarColor: Theme.of(context).primaryColor,toolbarWidgetColor: Theme.of(context).backgroundColor,sourcePath: imageFile.path,cropStyle: CropStyle.circle,aspectRatio: const CropAspectRatio(ratioX: 1,ratioY: 1),maxWidth: 420,maxHeight: 420,);
    return croppedFile;
  }

  Future<void> _uploadAllInformation() async {
    setState(() {
      _isProcessing = true;
    });
    widget.seniorUser.documentId =
        (await FirebaseAuth.instance.currentUser()).uid;
    widget.seniorUser.referralCode =
        'RO-' + randomAlphaNumeric(8).toUpperCase();
    widget.seniorUser.enterReferralCode = deepLinkReferralCode;
    await ApiProvider().createSeniorUserProfile(widget.seniorUser);
    endRegister = true;
    if (!_enableButton) {
      final imageData = await updateProfilePic(widget.seniorUser);
      await ApiProvider()
          .updateRositaProfileImage(imageData,widget.seniorUser.documentId);
    }

    setState(() {
      _isProcessing = false;
    });

    Rosita.restartApp(context);
  }

  Future<ImageObject> updateProfilePic(SeniorUser user) async {
    final imagename = DateTime.now().millisecondsSinceEpoch.toString() + '.jpg';
    final url = await ApiProvider()
        .updateProfilePic('rositapics/${user.documentId}/' + imagename,_image);
    final profileImage = ImageObject();
    profileImage.imageUrl = url.toString();
    profileImage.firebaseStoregPath =
        'rositapics/${user.documentId}/' + imagename;
    profileImage.imageName = imagename;
    return profileImage;
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...