feat: new widget query listable builder

This commit is contained in:
Kingkor Roy Tirtho
2023-02-16 13:05:23 +06:00
parent a85434a4db
commit 975f9eafe1
4 changed files with 108 additions and 0 deletions
@@ -0,0 +1,35 @@
import 'package:fl_query/fl_query.dart';
import 'package:flutter/material.dart';
import 'package:fl_query/src/widgets/state_notifier_listenable.dart';
typedef QueryListenableBuilder<DataType, ErrorType, KeyType> = Widget Function(
BuildContext context,
Query<DataType, ErrorType, KeyType>? query,
);
class QueryListenable<DataType, ErrorType, KeyType> extends StatelessWidget {
final ValueKey<KeyType> queryKey;
final QueryListenableBuilder<DataType, ErrorType, KeyType> builder;
const QueryListenable(
this.queryKey, {
required this.builder,
super.key,
});
@override
Widget build(BuildContext context) {
final query = QueryClient.of(context)
.getQuery<DataType, ErrorType, KeyType>(queryKey);
if (query == null) {
return builder(context, null);
}
return StateNotifierListenable<QueryState<DataType, ErrorType>>(
notifier: query,
builder: (context, notifier) {
final query = notifier as Query<DataType, ErrorType, KeyType>;
return builder(context, query);
},
);
}
}
@@ -0,0 +1,60 @@
import 'package:flutter/material.dart';
import 'package:state_notifier/state_notifier.dart';
typedef StateNotifierListenableBuilder<T> = Widget Function(
BuildContext context,
StateNotifier<T> value,
);
class StateNotifierListenable<T> extends StatefulWidget {
final StateNotifier<T> notifier;
final StateNotifierListenableBuilder<T> builder;
const StateNotifierListenable({
required this.notifier,
required this.builder,
super.key,
});
@override
State<StateNotifierListenable<T>> createState() =>
_StateNotifierListenableState<T>();
}
class _StateNotifierListenableState<T>
extends State<StateNotifierListenable<T>> {
VoidCallback? removeListener;
void initialize() {
removeListener = widget.notifier.addListener((_) {
setState(() {});
});
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
initialize();
});
}
@override
void dispose() {
removeListener?.call();
super.dispose();
}
@override
void didUpdateWidget(covariant StateNotifierListenable<T> oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.notifier != widget.notifier) {
removeListener?.call();
initialize();
}
}
@override
Widget build(BuildContext context) {
return widget.builder(context, widget.notifier);
}
}