feat: new widget query listable builder
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user