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