Last active
June 2, 2020 17:45
-
-
Save dsrenesanse/4d16176123961583d80748ac866eff97 to your computer and use it in GitHub Desktop.
news_exmpl.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
typedef ValueBuilder<T> = Widget Function(BuildContext context, T value); | |
typedef ErrorBuilder = Widget Function(BuildContext context, Object error); | |
class OsamBuilder<T> extends StatefulWidget { | |
final ValueStream<T> stream; | |
final ValueBuilder<T> builder; | |
final ErrorBuilder errorBuilder; | |
const OsamBuilder({Key key, @required this.stream, @required this.builder, this.errorBuilder}) : super(key: key); | |
@override | |
_OsamBuilderState<T> createState() => _OsamBuilderState<T>(); | |
} | |
class _OsamBuilderState<T> extends State<OsamBuilder<T>> with AfterLayoutMixin { | |
StreamSubscription<T> _dataSub; | |
T data; | |
Object error; | |
@override | |
Widget build(BuildContext context) { | |
return error != null ? widget.errorBuilder(context, error) : widget.builder(context, data ?? widget.stream.value); | |
} | |
@override | |
void afterFirstLayout(BuildContext context) { | |
_subscribe(); | |
} | |
@override | |
void didUpdateWidget(OsamBuilder<T> oldWidget) { | |
super.didUpdateWidget(oldWidget); | |
if (oldWidget.stream != widget.stream) { | |
_dataSub?.cancel(); | |
data = widget.stream.value; | |
_subscribe(); | |
} | |
} | |
void _subscribe() { | |
_dataSub = widget.stream.listen((event) { | |
error = null; | |
setState(() { | |
data = event; | |
}); | |
}); | |
_dataSub.onError((e) { | |
setState(() { | |
error = e; | |
}); | |
}); | |
} | |
@override | |
void dispose() { | |
_dataSub?.cancel(); | |
super.dispose(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment