Skip to content

Commit 659e633

Browse files
committed
refactor: let EventStreamHandler create channel
1 parent eb201d5 commit 659e633

File tree

3 files changed

+27
-22
lines changed

3 files changed

+27
-22
lines changed

flutter_readium/ios/flutter_readium/Sources/flutter_readium/EventStreamHandler.swift

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import Flutter
22

33
class EventStreamHandler: NSObject, FlutterStreamHandler {
44

5+
private let TAG: String
6+
private let streamName: String
7+
private var channel: FlutterEventChannel
8+
private var eventSink: FlutterEventSink?
9+
510
public func sendEvent(_ event: Any?) {
611
print(TAG, "sendEvent")
712
eventSink?(event)
@@ -19,12 +24,20 @@ class EventStreamHandler: NSObject, FlutterStreamHandler {
1924
return nil
2025
}
2126

22-
var eventSink: FlutterEventSink?
23-
var streamName: String
24-
let TAG: String
27+
func dispose() {
28+
print(TAG, "dispose")
29+
// End stream and clear the event-sink to prevent memory leaks.
30+
eventSink?(FlutterEndOfEventStream)
31+
eventSink = nil
32+
channel.setStreamHandler(nil)
33+
}
2534

26-
init(streamName: String) {
35+
init(withName streamName: String, messenger: FlutterBinaryMessenger) {
2736
self.streamName = streamName
28-
self.TAG = "EventStreamHandler[\(streamName)]"
37+
TAG = "EventStreamHandler[\(streamName)]"
38+
channel = FlutterEventChannel(name: "dk.nota.flutter_readium/\(streamName)", binaryMessenger: messenger)
39+
super.init()
40+
41+
channel.setStreamHandler(self)
2942
}
3043
}

flutter_readium/ios/flutter_readium/Sources/flutter_readium/FlutterReadiumPlugin.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,16 @@ func setCurrentReadiumReaderView(_ readerView: ReadiumReaderView?) {
2121
public class FlutterReadiumPlugin: NSObject, FlutterPlugin, ReadiumShared.WarningLogger {
2222
static var registrar: FlutterPluginRegistrar? = nil
2323

24-
24+
2525
/// TTS related variables
2626
/// TODO: Refactor into a TTSViewModel?
2727
@Published internal var playingUtterance: Locator?
2828
internal let playingWordRangeSubject = PassthroughSubject<Locator, Never>()
2929
internal var subscriptions: Set<AnyCancellable> = []
3030
internal var isMoving = false
31-
32-
internal static var audioLocatorChannel: FlutterEventChannel?
31+
3332
internal var audioLocatorStreamHandler: EventStreamHandler?
34-
33+
3534
internal var synthesizer: PublicationSpeechSynthesizer? = nil
3635
internal var ttsPrefs: TTSPreferences? = nil
3736

@@ -43,8 +42,7 @@ public class FlutterReadiumPlugin: NSObject, FlutterPlugin, ReadiumShared.Warnin
4342
let channel = FlutterMethodChannel(name: "dk.nota.flutter_readium/main", binaryMessenger: registrar.messenger())
4443
let instance = FlutterReadiumPlugin()
4544
registrar.addMethodCallDelegate(instance, channel: channel)
46-
47-
audioLocatorChannel = FlutterEventChannel(name: "dk.nota.flutter_readium/audio-locator", binaryMessenger: registrar.messenger())
45+
instance.audioLocatorStreamHandler = EventStreamHandler(withName: "audio-locator", messenger: registrar.messenger())
4846

4947
// Register reader view factory
5048
let factory = ReadiumReaderViewFactory(registrar: registrar)
@@ -53,12 +51,6 @@ public class FlutterReadiumPlugin: NSObject, FlutterPlugin, ReadiumShared.Warnin
5351
self.registrar = registrar
5452
}
5553

56-
public override init() {
57-
super.init()
58-
audioLocatorStreamHandler = EventStreamHandler(streamName: "audio-locator")
59-
FlutterReadiumPlugin.audioLocatorChannel?.setStreamHandler(audioLocatorStreamHandler)
60-
}
61-
6254
public func log(_ warning: Warning) {
6355
print(TAG, "Error in Readium: \(warning)")
6456
}
@@ -74,6 +66,8 @@ public class FlutterReadiumPlugin: NSObject, FlutterPlugin, ReadiumShared.Warnin
7466
}
7567
self.synthesizer?.stop()
7668
self.synthesizer = nil
69+
self.audioLocatorStreamHandler?.dispose()
70+
self.audioLocatorStreamHandler = nil
7771
result(nil)
7872
case "closePublication":
7973
let pubId = call.arguments as! String

flutter_readium/ios/flutter_readium/Sources/flutter_readium/ReadiumReaderView.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ private var userScripts: [WKUserScript] = []
2222
class ReadiumReaderView: NSObject, FlutterPlatformView, EPUBNavigatorDelegate {
2323

2424
private let channel: ReadiumReaderChannel
25-
private let textLocatorChannel: FlutterEventChannel
2625
private var textLocatorStreamHandler: EventStreamHandler?
2726
private let _view: UIView
2827
private let readiumViewController: EPUBNavigatorViewController
@@ -39,8 +38,9 @@ class ReadiumReaderView: NSObject, FlutterPlatformView, EPUBNavigatorDelegate {
3938
print(TAG, "::dispose")
4039
readiumViewController.view.removeFromSuperview()
4140
readiumViewController.delegate = nil
41+
textLocatorStreamHandler?.dispose()
42+
textLocatorStreamHandler = nil
4243
channel.setMethodCallHandler(nil)
43-
textLocatorChannel.setStreamHandler(nil)
4444
setCurrentReadiumReaderView(nil)
4545
}
4646

@@ -65,7 +65,7 @@ class ReadiumReaderView: NSObject, FlutterPlatformView, EPUBNavigatorDelegate {
6565

6666
channel = ReadiumReaderChannel(
6767
name: "\(readiumReaderViewType):\(viewId)", binaryMessenger: registrar.messenger())
68-
textLocatorChannel = FlutterEventChannel(name: "dk.nota.flutter_readium/text-locator", binaryMessenger: registrar.messenger())
68+
textLocatorStreamHandler = EventStreamHandler(withName: "text-locator", messenger: registrar.messenger())
6969

7070
print(TAG, "Publication: (identifier=\(String(describing: publication.metadata.identifier)),title=\(String(describing: publication.metadata.title)))")
7171
print(TAG, "Added publication at \(String(describing: publication.baseURL))")
@@ -100,8 +100,6 @@ class ReadiumReaderView: NSObject, FlutterPlatformView, EPUBNavigatorDelegate {
100100
super.init()
101101

102102
channel.setMethodCallHandler(onMethodCall)
103-
textLocatorStreamHandler = EventStreamHandler(streamName: "text-locator")
104-
textLocatorChannel.setStreamHandler(textLocatorStreamHandler)
105103
readiumViewController.delegate = self
106104

107105
let child: UIView = readiumViewController.view // Must specify type `UIView`, or we end up with an `UIView?` instead…

0 commit comments

Comments
 (0)