为将来可用的相机列表初始化相机



我正在使用我直接从pub.dev获得的关于初始化相机和创建可用相机列表的代码

列表是在Future main()函数中创建的,但当我导航到CameraApp页面时,它不会被自动调用。有人遇到过这个问题吗?我如何初始化相机,并创建可用相机的列表,当它导航到具有此代码的页面?请帮忙,谢谢。

/// CameraApp is the Main Application.
class CameraApp extends StatelessWidget {
/// Default Constructor
const CameraApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: CameraExampleHome(),
);
}
}
List<CameraDescription> _cameras = <CameraDescription>[];
Future<void> main() async {
// Fetch the available cameras before initializing the app.
try {
WidgetsFlutterBinding.ensureInitialized();
_cameras = await availableCameras();
} on CameraException catch (e) {
_logError(e.code, e.description);
}
runApp(const CameraApp());
}

这是我从按钮内部调用CameraApp函数的代码:

ElevatedButton(
onPressed: () 
{Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CameraApp()));},
child: const Text('Camera'),
style: ElevatedButton.styleFrom(
minimumSize: const Size(160.0, 35.0)),
),

您可以创建一种单例来管理相机操作。

class CameraManager {
// Declare your camera list here
List<CameraDescription> _cameras = <CameraDescription>[];
// Constructor
CameraManager._privateConstructor() {}
// initialise instance
static final CameraManager instance =
CameraManager._privateConstructor();
// Add a getter to access camera list
List<CameraDescription> get cameras => _cameras;
// Init method
init() async {
try {
_cameras = await availableCameras();
} on CameraException catch (e) {
_logError(e.code, e.description);
}
}
// other needed methods to manage camera
...
}

然后在main函数

Future<void> main() async {
// Fetch the available cameras before initializing the app.
try {
WidgetsFlutterBinding.ensureInitialized();
await CameraManager.instance.init();
}
runApp(const CameraApp());
}

然后在其他应用程序的一部分,您可以导入与CameraManager.instance.*singleton和访问方法和属性,例如CameraManager.instance.cameras通过getter访问_cameras

这里有几件事需要考虑。您所做的实现是正确的,但是您将相机命名为私有变量,该变量将通过添加_ like _cameras在单个dart文件中访问。删除它后,只需导入main.dart

,它就可以在所有类中全局可用。这是完整的代码

main.dart

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:trial/CameraExampleHome.dart';
List<CameraDescription> cameras = <CameraDescription>[];
void main() async {
try {
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
print(cameras);
} on CameraException catch (e) {
print(e.toString());
}
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(home: CameraApp());
}
}
class CameraApp extends StatelessWidget {
/// Default Constructor
const CameraApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: CameraExampleHome(),
);
}
}

cameraExampleHome.dart

import 'package:flutter/material.dart';
import 'main.dart';
class CameraExampleHome extends StatefulWidget {
const CameraExampleHome({Key? key}) : super(key: key);
@override
State<CameraExampleHome> createState() => _CameraExampleHomeState();
}
class _CameraExampleHomeState extends State<CameraExampleHome> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("Available Cameras $cameras"),
//output: Available Cameras [CameraDescription(0, CameraLensDirection.back, 90), CameraDescription(1, CameraLensDirection.front, 270), CameraDescription(2, CameraLensDirection.front, 270)]
),
);
}
}

你可以为全局变量创建一个库文件。

创建一个名为"global . dat ">

在顶部声明以下行。

library your_project_name.globals;

然后在里面设置变量

List<CameraDescription> cameras = <CameraDescription>[];

main

中的用法
import 'globals.dart' as globals;
main() {
...
globals.cameras = await availableCameras();
...
}

然后在项目的任何地方使用该变量。

import 'globals.dart' as globals;
globals.cameras...

如下声明cameraddescription全局实例列表:

List<CameraDescription> cameras = <CameraDescription>[];

现在您可以通过导入main来访问相机实例。Dart, _总是将实例变量设为private,这样在文件

之外就不能访问了。

最新更新