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先生