Flutter 轻触Android摄像头颤振驱动程序

Flutter 轻触Android摄像头颤振驱动程序,flutter,flutter-test,Flutter,Flutter Test,我在颤振中做集成测试,在应用程序中我打开相机,但我不知道如何点击按钮来拍照,有人知道我如何搜索这个按钮吗 这是应用程序的代码,你可以在其中选择一张带相机的照片,或者选择一张画廊的照片 import 'dart:io'; import 'package:permission_handler/permission_handler.dart'; import 'package:random_string/random_string.dart'; import 'package:cached_netwo

我在颤振中做集成测试,在应用程序中我打开相机,但我不知道如何点击按钮来拍照,有人知道我如何搜索这个按钮吗

这是应用程序的代码,你可以在其中选择一张带相机的照片,或者选择一张画廊的照片

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),
                  isTrack: true,
                  color: AppTheme.primaryColor,
                  body: Center(
                    child: Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: Text(
                        FireText.of('choose_from_gallery'),
                        textAlign: TextAlign.center,
                        style: Theme.of(context)
                            .primaryTextTheme
                            .subtitle2
                            .copyWith(
                              color: Theme.of(context).backgroundColor,
                            ),
                      ),
                    ),
                  ),
                  onTap: () {
                    getImage(isGallery: true);
                  },
                ),
                verticalSpacer(),
                if (_image != null || _enableButton)
                  ButtonUI(
                    buttonName: 'ProfilePhotoUploadButton',
                    key: const Key(Keys.uploadButton),
                    isTrack: true,
                    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;
  }
}
导入'dart:io';
导入“package:permission_handler/permission_handler.dart”;
导入“package:random_string/random_string.dart”;
导入“package:cached_network_image/cached_network_image.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“package:image_cropper/image_cropper.dart”;
导入“包:image_picker/image_picker.dart”;
导入“程序包:modal_progress_hud/modal_progress_hud.dart”;
导入“package:rosita/language/firebase_remote.dart”;
导入“包:rosita/api/api_provider.dart”;
导入“包:rosita/constants/common.dart”;
导入“package:rosita/model/image_object.dart”;
导入“包:rosita/model/senior_user.dart”;
导入“包:rosita/modules/widgets/button_ui.dart”;
进口“包装:rosita/rosita.dart”;
类AddProfileImageScreen扩展StatefulWidget{
const AddProfileImageScreen({Key-Key,this.seniorUser}):super(Key:Key);
最终高级用户;
@凌驾
_AddProfileImageScreenState createState()=>\u AddProfileImageScreenState();
}
类_AddProfileImageScreenState扩展状态{
bool_isProcessing=false;
文件图像;
bool _enableButton=false;
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:主题。背景。脚手架背景颜色,
正文:ModalProgressHUD(
inAsyncCall:_i处理,
颜色:颜色。透明,
进程指示器:常量循环进程指示器(
冲程宽度:2.0,
),
子:容器(
padding:EdgeInsets.only(top:MediaQuery.of(context.padding.top)),
约束:BoxConstraints(
minHeight:MediaQuery.of(context).size.height,
minWidth:MediaQuery.of(context.size.width),
孩子:填充(
填充:常数边集。全部(24),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
darkSubtitleText('choose_profile_picture',context),
扩大(
儿童:中心(
孩子:大小盒子(
宽度:100,
身高:100,
孩子:卡片(
形状:圆形矩形边框(
侧边:const BorderSide(
颜色:AppTheme.purpleColor,
宽度:4,
),
边界半径:边界半径。圆形(60.0),
),
海拔:0,
颜色:主题。背景。分割颜色,
子项:_image==null
?(widget.seniorUser!=null&&
widget.seniorUser.profileImage!=null&&
widget.seniorUser.profileImage.imageUrl=
'')
?缓存网络映像(
图像URL:
widget.seniorUser.profileImage.imageUrl,
占位符:
(BuildContext上下文,字符串url)=>
Image.asset(ConstantsData.appIcon),
errorWidget:(构建上下文上下文,
字符串url,错误)=>
常量图标(图标错误),
适合:BoxFit.cover,
)
:Image.asset(ConstantsData.appIcon)
:Image.file(_Image),
),
),
),
),
钮扣(
buttonName:'ProfilePhotoFromCameraButton',
键:常数键(键.摄像机按钮),
伊斯特拉克:是的,
颜色:AppTheme.primaryColor,
正文:中(
孩子:填充(
填充:常数边集全部(16.0),
子:文本(
FireText.of(‘用你的相机拍照’),
textAlign:textAlign.center,
风格:主题(上下文)
.primaryTextTheme
.副标题2
.抄袭(
颜色:主题。背景色,
),
),
),
),
onTap:(){
getImage(isGallery:false);
},
),
垂直间隔垫圈(),
钮扣(
按钮名称:'ProfilePhotoFromGalleryButton',
键:常量键(键。galleryButton),
伊斯特拉克:是的,
颜色:AppTheme.primaryColor,
正文:中(
孩子:填充(
填充:常数边集全部(16.0),
子:文本(
FireText.of('choose_from_gallery'),
textAlign:textAlign.center,
风格:主题(上下文)
.primaryTextTheme
.副标题2
copyWi先生