fix crash, current rgba ffi design still ugly and dangerous

This commit is contained in:
open-trade 2020-11-18 18:12:43 +08:00
parent 33186e28d1
commit c469329d19
2 changed files with 17 additions and 11 deletions

View File

@ -80,13 +80,12 @@ class FFI {
setByName('connect', id); setByName('connect', id);
} }
static void _clearRgbaFrame() { static void clearRgbaFrame() {
if (_lastRgbaFrame != null && _lastRgbaFrame != nullptr) if (_lastRgbaFrame != null && _lastRgbaFrame != nullptr)
_freeRgba(_lastRgbaFrame); _freeRgba(_lastRgbaFrame);
} }
static Uint8List getRgba() { static Uint8List getRgba() {
_clearRgbaFrame();
_lastRgbaFrame = _getRgba(); _lastRgbaFrame = _getRgba();
if (_lastRgbaFrame == null || _lastRgbaFrame == nullptr) return null; if (_lastRgbaFrame == null || _lastRgbaFrame == nullptr) return null;
final ref = _lastRgbaFrame.ref; final ref = _lastRgbaFrame.ref;
@ -115,7 +114,6 @@ class FFI {
} }
static void close() { static void close() {
_clearRgbaFrame();
setByName('close', ''); setByName('close', '');
} }

View File

@ -21,6 +21,7 @@ class _RemotePageState extends State<RemotePage> {
ui.Image _image; ui.Image _image;
PeerInfo _pi = PeerInfo(); PeerInfo _pi = PeerInfo();
Display _display = Display(); Display _display = Display();
bool _decoding = false;
@override @override
void initState() { void initState() {
@ -39,6 +40,7 @@ class _RemotePageState extends State<RemotePage> {
FFI.close(); FFI.close();
_interval.cancel(); _interval.cancel();
dismissLoading(); dismissLoading();
_decoding = null;
} }
void interval() { void interval() {
@ -53,17 +55,23 @@ class _RemotePageState extends State<RemotePage> {
handleSwitchDisplay(evt); handleSwitchDisplay(evt);
} }
} }
if (!_decoding) {
var rgba = FFI.getRgba(); var rgba = FFI.getRgba();
if (rgba != null) { if (rgba != null) {
_decoding = true;
ui.decodeImageFromPixels( ui.decodeImageFromPixels(
rgba, _display.width, _display.height, ui.PixelFormat.bgra8888, rgba, _display.width, _display.height, ui.PixelFormat.bgra8888,
(__image) { (__image) {
FFI.clearRgbaFrame();
if (_decoding == null) return;
_decoding = false;
setState(() { setState(() {
_image = __image; _image = __image;
}); });
}); });
} }
} }
}
void handleSwitchDisplay(Map<String, dynamic> evt) { void handleSwitchDisplay(Map<String, dynamic> evt) {
_pi.currentDisplay = int.parse(evt['display']); _pi.currentDisplay = int.parse(evt['display']);