You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:如何在Container内添加控制相机闪光灯的FloatingActionButton

基于camera包实现闪光灯开关的解决方案

不需要额外引入torch类的包,camera库本身就提供了控制闪光灯的API。以下是修改后的完整代码,添加了闪光灯开关的FloatingActionButton:

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

class CameraScreen extends StatefulWidget {
  CameraScreen({Key? key, required this.controller}) : super(key: key);
  final CameraController controller;

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

class _CameraScreenState extends State<CameraScreen> {
  // 跟踪闪光灯状态
  bool _isFlashOn = false;

  // 切换闪光灯方法
  Future<void> _toggleFlash() async {
    try {
      // 检查当前相机是否支持闪光灯并切换状态
      if (widget.controller.value.flashMode == FlashMode.torch) {
        await widget.controller.setFlashMode(FlashMode.off);
        setState(() => _isFlashOn = false);
      } else {
        await widget.controller.setFlashMode(FlashMode.torch);
        setState(() => _isFlashOn = true);
      }
    } catch (e) {
      // 处理相机未初始化、设备不支持闪光灯等异常
      debugPrint("闪光灯切换失败: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size.width;

    return Container(
      child: ShaderMask(
        shaderCallback: (rect) {
          return LinearGradient(
                  begin: Alignment.topCenter,
                  end: Alignment.center,
                  colors: [Colors.black, Colors.transparent])
              .createShader(Rect.fromLTRB(0, 0, rect.width, rect.height / 4));
        },
        blendMode: BlendMode.darken,
        child: Transform.scale(
          scale: 1.0,
          child: AspectRatio(
            aspectRatio: MediaQuery.of(context).size.aspectRatio,
            child: OverflowBox(
              alignment: Alignment.center,
              child: FittedBox(
                fit: BoxFit.fitHeight,
                child: Container(
                  width: size,
                  height: size / widget.controller.value.aspectRatio,
                  child: Stack(
                    children: <Widget>[
                      CameraPreview(widget.controller),
                      // 闪光灯开关按钮,定位在右下角
                      Positioned(
                        bottom: 20,
                        right: 20,
                        child: FloatingActionButton(
                          onPressed: _toggleFlash,
                          backgroundColor: _isFlashOn ? Colors.amber : Colors.grey[800],
                          child: Icon(
                            _isFlashOn ? Icons.flash_on : Icons.flash_off,
                            color: Colors.white,
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 页面销毁时自动关闭闪光灯
    widget.controller.setFlashMode(FlashMode.off);
    super.dispose();
  }
}

关键说明:

  • 利用camera库的setFlashMode方法控制闪光灯,FlashMode.torch对应常亮模式,FlashMode.off对应关闭状态
  • 通过_isFlashOn变量跟踪状态,同步更新按钮的图标和背景色
  • 在dispose方法中关闭闪光灯,避免页面销毁后闪光灯持续亮起
  • 添加异常捕获,处理相机未初始化、设备无闪光灯等场景的错误

内容的提问来源于stack exchange,提问作者Kassa Suhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:40:21