feat: new widget query listable builder
This commit is contained in:
@@ -21,6 +21,18 @@ class MainApp extends StatelessWidget {
|
||||
final value = Random().nextInt(200000);
|
||||
return MaterialApp(
|
||||
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>(
|
||||
const ValueKey('hello'),
|
||||
() {
|
||||
|
||||
@@ -12,3 +12,4 @@ export 'src/core/provider.dart';
|
||||
export 'src/core/query.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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user