Skip to content

Instantly share code, notes, and snippets.

@mono0926
Last active August 13, 2019 00:30
Show Gist options
  • Save mono0926/52c8441960cdd5b62aaf31d9eb336072 to your computer and use it in GitHub Desktop.
Save mono0926/52c8441960cdd5b62aaf31d9eb336072 to your computer and use it in GitHub Desktop.
import 'package:flutter/widgets.dart';
import 'package:rxdart/rxdart.dart';
/// - https://raw.githubusercontent.com/Kavantix/bloc_streambuilder/master/lib/src/value_observable_builder.dart
/// - https://twitter.com/_mono/status/1078948544784941058
class ValueObservableBuilder<T> extends StatefulWidget {
const ValueObservableBuilder({
Key key,
@required this.builder,
@required this.stream,
this.child,
}) : super(key: key);
final ValueObservable<T> stream;
final AsyncWidgetBuilder<T> builder;
final Widget child;
@override
_ValueObservableBuilderState createState() =>
_ValueObservableBuilderState<T>();
}
class _ValueObservableBuilderState<T> extends State<ValueObservableBuilder<T>> {
@override
Widget build(BuildContext context) {
return StreamBuilder<T>(
initialData: widget.stream.value,
stream: widget.stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting &&
snapshot.hasData) {
snapshot = AsyncSnapshot<T>.withData(
ConnectionState.active,
snapshot.data,
);
}
return widget.builder(
context,
snapshot,
widget.child,
);
},
);
}
}
typedef AsyncWidgetBuilder<T> = Widget Function(
BuildContext context,
AsyncSnapshot<T> snapshot,
Widget child,
);
@macoshita
Copy link

仰る通りなるべくネストはさせたくないですね。。
child は他にネットで見かけた StreamBuilder 拡張よりもよいなーと感じたので、自作のコードに採用させて頂いております 🙏
返信ありがとうございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment