Apparence-io / CamerAwesome

📸 Embedding a camera experience within your own app shouldn't be that hard. A flutter plugin to integrate awesome Android / iOS camera experience.
https://ApparenceKit.dev
MIT License
949 stars 240 forks source link

Switching flash mode triggers an internal error #171

Open Zazo032 opened 1 year ago

Zazo032 commented 1 year ago

Steps to Reproduce

Call state.sensorConfig.switchCameraFlash

Expected results

FlashMode iterates to the next one

Actual results

I/flutter (12799): ----------------FIREBASE CRASHLYTICS----------------
I/flutter (12799): Bad state: Cannot add new events after calling close
I/flutter (12799): #0      _BroadcastStreamController.add (dart:async/broadcast_stream_controller.dart:243:24)
I/flutter (12799): #1      Subject._add (package:rxdart/src/subjects/subject.dart:151:17)
I/flutter (12799): #2      Subject.add (package:rxdart/src/subjects/subject.dart:141:5)
I/flutter (12799): #3      _StreamSinkWrapper.add (package:rxdart/src/subjects/subject.dart:215:13)
I/flutter (12799): #4      SensorConfig.setFlashMode (package:camerawesome/src/orchestrator/sensor_config.dart:76:31)
I/flutter (12799): <asynchronous suspension>
I/flutter (12799): ----------------------------------------------------
I/flutter (12799): Bad state: Cannot add new events after calling close
I/flutter (12799): #0      _BroadcastStreamController.add (dart:async/broadcast_stream_controller.dart:243:24)
I/flutter (12799): #1      Subject._add (package:rxdart/src/subjects/subject.dart:151:17)
I/flutter (12799): #2      Subject.add (package:rxdart/src/subjects/subject.dart:141:5)
I/flutter (12799): #3      _StreamSinkWrapper.add (package:rxdart/src/subjects/subject.dart:215:13)
I/flutter (12799): #4      SensorConfig.setFlashMode (package:camerawesome/src/orchestrator/sensor_config.dart:76:31)
I/flutter (12799): <asynchronous suspension>

About your device

Brand Model OS
Samsung A21s 12
Zazo032 commented 1 year ago

Using latest version of the repo:

camerawesome:
    git:
      url: https://github.com/Apparence-io/camera_awesome.git

Using Flutter version 3.3.10.

Using CameraAwesomeBuilder.custom:

CameraAwesomeBuilder.custom(
  enableAudio: false,
  saveConfig: SaveConfig.photo(
    pathBuilder: () => photoPath,
  ),
  builder: (CameraState state) {
    return IconButton(
      color: Colors.white,
      icon: Icon(_getFlashIcon(state.sensorConfig.flashMode)),
      key: const Key('flash_icon'),
      onPressed: state.sensorConfig.switchCameraFlash,
    );
  }
),
apalala-dev commented 1 year ago

This error appears because you are using an old sensorConfig which has been disposed internally. You should use the stream version (sensorConfig$) as explained in #172. However, I am not sure we should let things in this current state since they might not be easy to understand for newcomers.

I see two possible ways of dealing with this:

What do you think @g-apparence ?

g-apparence commented 1 year ago

Interesting.

I would go for solution 2. Making the getter nullable and returning value only if stream is not disposed.

@Zazo032 I would go for StreamBuilder in your case. Would be way easier to refresh the current icon.