我对 flutter 还很陌生,我正在尝试让应用程序使用相机包拍照,并将其保存到设备本地图库,但它没有用。一旦我拍完照片并尝试保存到图库,它确实弹出“成功下载”但我的图库中没有显示照片。
我确实看过其他类似的问题,比如
https://stackoverflow.com/questions/74743394/saving-list-of-objects-locally-on-device-with-shared-preferences-in-flutter
上的问题,并尝试解决它们,但对我没有用。知道有什么问题吗?
这是我在
pubspec.yaml
中尝试使用的所有依赖项
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
image_picker: ^0.8.6
permission_handler: ^9.2.0
camera: ^0.8.1+7
dio: ^4.0.6
gallery_saver: ^2.3.2
path_provider: ^2.0.15
path: ^1.8.2
image_gallery_saver: ^1.7.1
从我的
main.dart
我有一个“拍照”按钮,它会带你到相机(camera_page.dart
)
ElevatedButton(
onPressed: () async {
await availableCameras().then((value) => Navigator.push(
context,
MaterialPageRoute(
builder: (_) => CameraPage(cameras: value))));
},
child: const Text("TAKE PICTURES"),
style: ElevatedButton.styleFrom(fixedSize: const Size(350, 50)),
),
这是我
camera_page.dart
.中的所有代码
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:pdf_combine_app/preview_page.dart';
class CameraPage extends StatefulWidget {
const CameraPage({Key? key, required this.cameras}) : super(key: key);
final List<CameraDescription>? cameras;
@override
State<CameraPage> createState() => _CameraPageState();
}
class _CameraPageState extends State<CameraPage> {
late CameraController _cameraController;
bool _isRearCameraSelected = true;
@override
void dispose() {
_cameraController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
initCamera(widget.cameras![0]);
}
Future takePicture() async {
if (!_cameraController.value.isInitialized) {
return null;
}
if (_cameraController.value.isTakingPicture) {
return null;
}
try {
await _cameraController.setFlashMode(FlashMode.off);
XFile picture = await _cameraController.takePicture();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PreviewPage(
picture: picture,
)));
} on CameraException catch (e) {
debugPrint('Error occured while taking picture: $e');
return null;
}
}
Future initCamera(CameraDescription cameraDescription) async {
_cameraController =
CameraController(cameraDescription, ResolutionPreset.high);
try {
await _cameraController.initialize().then((_) {
if (!mounted) return;
setState(() {});
});
} on CameraException catch (e) {
debugPrint("camera error $e");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Stack(children: [
(_cameraController.value.isInitialized)
? CameraPreview(_cameraController)
: Container(
color: Colors.black,
child: const Center(child: CircularProgressIndicator())),
Align(
alignment: Alignment.bottomCenter,
child: Container(
height: MediaQuery.of(context).size.height * 0.20,
decoration: const BoxDecoration(
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
color: Colors.black),
child:
Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
Expanded(
child: IconButton(
padding: EdgeInsets.zero,
iconSize: 30,
icon: Icon(
_isRearCameraSelected
? CupertinoIcons.switch_camera
: CupertinoIcons.switch_camera_solid,
color: Colors.white),
onPressed: () {
setState(
() => _isRearCameraSelected = !_isRearCameraSelected);
initCamera(widget.cameras![_isRearCameraSelected ? 0 : 1]);
},
)),
Expanded(
child: IconButton(
onPressed: takePicture,
iconSize: 50,
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
icon: const Icon(Icons.circle, color: Colors.white),
)),
const Spacer(),
]),
)),
]),
));
}
}
如果你点击按钮拍照,它会带你到
preview_page.dart
,在那里它会显示拍摄的照片和一个下载它的按钮
这是
preview_page.dart
的完整代码
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';
class PreviewPage extends StatelessWidget {
const PreviewPage({Key? key, required this.picture}) : super(key: key);
final XFile picture;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Preview Page')),
body: Center(
child: Column(mainAxisSize: MainAxisSize.min, children: [
Image.file(File(picture.path), fit: BoxFit.cover, width: 250),
const SizedBox(height: 24),
Text(picture.name),
Center(
child: ElevatedButton(
child: const Text('Download'),
onPressed: () async {
await GallerySaver.saveImage(picture.path);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Successfully Downloaded!!')));
},
),
)
]),
),
);
}
}