Skip to content

Commit

Permalink
[APP-2377] Show camera errors (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
njooma authored Aug 28, 2023
1 parent 632c389 commit 49b28c9
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 44 deletions.
40 changes: 30 additions & 10 deletions lib/widgets/camera_stream.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'dart:async';

import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
import 'package:logger/logger.dart';
import 'package:viam_sdk/viam_sdk.dart';
Expand All @@ -22,6 +22,7 @@ class ViamCameraStreamView extends StatefulWidget {
class _ViamCameraStreamViewState extends State<ViamCameraStreamView> {
late RTCVideoRenderer _renderer;
late StreamSubscription<MediaStream> _streamSub;
Exception? _error;

@override
void initState() {
Expand All @@ -42,21 +43,40 @@ class _ViamCameraStreamViewState extends State<ViamCameraStreamView> {
await _renderer.initialize();
final stream = widget.streamClient.getStream();
_streamSub = stream.listen((event) {
_error = null;
_renderer.srcObject = event;
setState(() {});
});
_streamSub.onError((error, trace) => Logger().e(
'Encountered a stream error for camera ${widget.camera.name}',
error: error,
stackTrace: trace,
));
_streamSub.onError((error, trace) {
Logger().e(
'Encountered a stream error for camera ${widget.camera.name}',
error: error,
stackTrace: trace,
);
setState(() {
_error = error;
});
});
}

@override
Widget build(BuildContext context) {
return Container(
constraints: const BoxConstraints(maxHeight: 300),
child: RTCVideoView(_renderer),
);
return (_error != null)
? Padding(
padding: const EdgeInsets.all(16),
child: Column(mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [
Text(
'Encountered a stream error for camera: ${widget.camera.name}',
style: Theme.of(context).textTheme.titleLarge,
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(_error.toString(), textAlign: TextAlign.center),
]),
)
: Container(
constraints: const BoxConstraints(maxHeight: 300),
child: RTCVideoView(_renderer),
);
}
}
81 changes: 47 additions & 34 deletions lib/widgets/resources/base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,43 +52,56 @@ class _ViamBaseScreenState extends State<ViamBaseScreen> {
});
}

Widget _buildCamera() {
if (widget.cameras.isNotEmpty) {
return Column(children: [
Center(
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
const Text('Video feed from: '),
if (widget.cameras.length > 1)
DropdownButton<Camera>(
value: camera,
icon: const Icon(Icons.keyboard_arrow_down),
items: widget.cameras
.map((e) => DropdownMenuItem(
value: e,
child: Text(e.name),
))
.toList(),
onChanged: (value) => _setCamera(value),
)
else
Text(camera!.name)
]),
),
if (camera != null)
ViamCameraStreamView(camera: camera!, streamClient: widget.robotClient.getStream(camera!.name))
else
const SizedBox(height: 300),
]);
}
return const SizedBox.shrink();
}

Widget _spacer() {
if (widget.cameras.isNotEmpty) {
return const Spacer();
}
return const SizedBox.shrink();
}

@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (widget.cameras.isNotEmpty)
Column(children: [
Center(
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
const Text('Video feed from: '),
if (widget.cameras.length > 1)
DropdownButton<Camera>(
value: camera,
icon: const Icon(Icons.keyboard_arrow_down),
items: widget.cameras
.map((e) => DropdownMenuItem(
value: e,
child: Text(e.name),
))
.toList(),
onChanged: (value) => _setCamera(value),
)
else
Text(camera!.name)
]),
),
if (camera != null)
ViamCameraStreamView(camera: camera!, streamClient: widget.robotClient.getStream(camera!.name))
else
const SizedBox(height: 300),
]),
ViamBaseJoystick(base: widget.base)
],
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_buildCamera(),
_spacer(),
Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 0, 48),
child: ViamBaseJoystick(base: widget.base),
),
),
],
);
}
}

0 comments on commit 49b28c9

Please # to comment.