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
+12
View File
@@ -21,6 +21,18 @@ class MainApp extends StatelessWidget {
final value = Random().nextInt(200000); final value = Random().nextInt(200000);
return MaterialApp( return MaterialApp(
home: Scaffold( home: Scaffold(
floatingActionButton: QueryListenable<String, dynamic, String>(
const ValueKey('hello'), builder: (context, query) {
if (query == null) {
return const SizedBox();
}
return FloatingActionButton(
onPressed: () {
query.refresh();
},
child: Text(query.data ?? 'No Data'),
);
}),
body: QueryBuilder<String, dynamic, String>( body: QueryBuilder<String, dynamic, String>(
const ValueKey('hello'), const ValueKey('hello'),
() { () {
+1
View File
@@ -12,3 +12,4 @@ export 'src/core/provider.dart';
export 'src/core/query.dart'; export 'src/core/query.dart';
export 'src/widgets/query_builder.dart'; export 'src/widgets/query_builder.dart';
export 'src/widgets/query_listenable.dart';
@@ -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);
}
}