diff --git a/lib/recorder_bloc/recorder_bloc.dart b/lib/recorder_bloc/recorder_bloc.dart index 1bcd35b..5a26267 100644 --- a/lib/recorder_bloc/recorder_bloc.dart +++ b/lib/recorder_bloc/recorder_bloc.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:bloc/bloc.dart'; @@ -7,51 +8,32 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:doddle/models/recorder_controller.dart'; +import 'package:screen_recorder/screen_recorder.dart'; import '../doddler.dart'; import 'recorder_event.dart'; import 'recorder_state.dart'; class RecorderBloc extends Bloc { - RecorderController? recorderController = - RecorderController(frames: [], globalKey: GlobalKey()); - int index = 0; - bool isRecording = false; - int recordingIndex = 0; - Timer? timer; + ScreenRecorderController? recorderController; + List? old_gif = []; RecorderBloc({this.recorderController}) : super(InitialRecorderState()); @override Stream mapEventToState(RecorderEvent event) async* { - if (event is TakeSnapshotEvent) { - if (!isRecording) { - timer = - Timer.periodic(const Duration(milliseconds: 34), (Timer t) async { - final frames = recorderController!.frames; + if (event is StartRecordingEvent) { + recorderController!.start(); + yield RecordState(RecordStatus.startRecording); + } else if (event is PrepareVideoPageEvent) { + print(old_gif); + recorderController!.stop(); + yield RecordState(RecordStatus.prepareVideo); + List? gif = await recorderController!.export(); - final image = await canvasToImage(event.globalKey!); - frames!.add(Frame(frame: image, index: index++)); - recorderController = recorderController!.copyWith(frames: frames); - }); - } - } else if (event is SaveGifEvent) { - add(StopRecordingEvent()); - yield MessageState("Waiting ... "); - final gif = await recorderController!.export(); - yield ShowGifState(gif: gif); - } else if (event is StartRecordingEvent) { - add(TakeSnapshotEvent(globalKey: Doddler.globalKey)); - } else if (event is StopRecordingEvent) { - timer!.cancel(); + yield RecordState(RecordStatus.donePreparingVideo, + obg: gif!.followedBy(old_gif ?? []).toList()); + old_gif = gif.followedBy(old_gif ?? []).toList(); } } - - Future canvasToImage(GlobalKey globalKey) async { - final boundary = - globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; - - final image = await boundary.toImage(); - return image; - } } diff --git a/lib/recorder_bloc/recorder_event.dart b/lib/recorder_bloc/recorder_event.dart index 030fed5..db91be4 100644 --- a/lib/recorder_bloc/recorder_event.dart +++ b/lib/recorder_bloc/recorder_event.dart @@ -2,12 +2,6 @@ import 'package:flutter/cupertino.dart'; abstract class RecorderEvent {} -class TakeSnapshotEvent extends RecorderEvent { - final GlobalKey? globalKey; - - TakeSnapshotEvent({this.globalKey}); -} - class StartRecordingEvent extends RecorderEvent {} class StopRecordingEvent extends RecorderEvent {} @@ -18,6 +12,10 @@ class StopVideoEvent extends RecorderEvent {} class SaveGifEvent extends RecorderEvent {} +class PrepareVideoPageEvent extends RecorderEvent { + +} + class CallNextFrameEvent extends RecorderEvent { final int index; CallNextFrameEvent({ diff --git a/lib/recorder_bloc/recorder_state.dart b/lib/recorder_bloc/recorder_state.dart index 74676a1..5b78bf6 100644 --- a/lib/recorder_bloc/recorder_state.dart +++ b/lib/recorder_bloc/recorder_state.dart @@ -1,14 +1,23 @@ import 'package:doddle/models/frame.dart'; +enum RecordStatus { + none, + prepareVideo, + donePreparingVideo, + stopRecording, + startRecording, + stopPlaying, + startPlaying +} + abstract class RecorderState {} class InitialRecorderState extends RecorderState {} -class NextFrameState extends RecorderState { - final Frame? frame; - NextFrameState({ - this.frame, - }); +class RecordState extends RecorderState { + RecordStatus record; + Object? obg; + RecordState(this.record,{this.obg}); } class MessageState extends RecorderState {