fluq 0.0.2 fluq: ^0.0.2 copied to clipboard
A simple state management api based on streams with query and mutation handlers
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:fluq/fluq.dart';
void main() {
runApp(MyApp());
}
/// query declaration
class MyQuery extends QueryModel {
get key => "my-query";
@override
Future fetch([Map<String, dynamic> params]) async {
await Future.delayed(const Duration(seconds: 1));
return {
'result': 'apiTestResult',
};
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
/// initialize Fluq provider
return FluqProvider(
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
Widget buildMyQuery(BuildContext context, QueryState state) {
if (state is QueryLoading) {
return CircularProgressIndicator();
}
if (state is QueryError) {
return Text('${state.error}');
}
final result = state as QueryResult;
return Text(json.encode(result.data));
}
@override
Widget build(BuildContext context) {
/// query listener, listen for error to display in snackbar
return QueryListener(
query: MyQuery(),
listener: (context, state) {
if (state is QueryError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [Text(' Error!!!')],
),
),
);
}
},
child: Scaffold(
appBar: AppBar(
title: Text('My Homepage'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
/// test actions
TextButton(
onPressed: () {
Fluq.of(context).invalidateAllQuery();
},
child: Text('invalidate cache'),
),
Mutation(
fetch: () => Future.delayed(const Duration(seconds: 1))
.then((_) => 'new result'),
update: (fluq, result) {
fluq.setQueryState(
MyQuery().key,
QueryResult({'result': result}),
);
},
builder: (context, fetch) => TextButton(
onPressed: fetch,
child: Text('trigger mutation'),
),
),
TextButton(
onPressed: () async {
Fluq.of(context).setQueryState(
MyQuery().key, QueryError('this is an error!'));
},
child: Text('trigger error'),
),
// query builders
QueryBuilder(
query: MyQuery(),
builder: buildMyQuery,
),
QueryBuilder(
query: MyQuery(),
builder: buildMyQuery,
),
],
),
),
),
);
}
}