flagdeck 0.0.4
flagdeck: ^0.0.4 copied to clipboard
A Flutter SDK for Flagdeck - a feature flag management service that enables controlled feature rollouts, A/B testing, and remote configuration.
example/lib/main.dart
import 'dart:developer';
import 'package:eventflux/models/reconnect.dart';
import 'package:flagdeck/flagdeck.dart';
import 'package:flagdeck/model/eval_payload/context.dart';
import 'package:flagdeck/model/eval_payload/index.dart';
import 'package:flagdeck/model/eval_result/index.dart';
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final FlagDeckSdk flagDeckSdk = FlagDeckSdk(
apiKey: "key",
onSseEvent: (flagKey, event, data) {
log(
"FlagDeckSdk onSseEvent $flagKey ${data.flag?.active} ${event.event} ${data.timestamp}",
);
},
onSseConnect: (event) {
log("onSseConnect connected ${event.flag} ${event.timestamp}");
},
handleSseConnectionError: (error) {
log("FlagDeckSdk handleConnectionError ${error.message}");
},
handleSseDisconnect: () {
log("FlagDeckSdk handleDisconnect");
},
sseReconnectConfig: ReconnectConfig(
mode: ReconnectMode.linear,
interval: Duration(seconds: 10),
),
);
void checkSSE() async {
flagDeckSdk.serverSentEvents.close();
log(
"flagDeckSdk.serverSentEvents.connected ${flagDeckSdk.serverSentEvents.connected}",
);
}
void sendToServer() async {
await flagDeckSdk.sendLocalEventsToServer();
setState(() {
//
});
return;
}
void addFlag() async {
EvaluationResult? evaluationResult = await flagDeckSdk.evaluateOrFind(
FlagdeckRequestData(
flagKey: 'flagkey',
context: EvaluationContext(userId: "777"),
// enableOfflineMode: true,
// invalidateCache: true,
// onBeforeRequest: () {},
// onSuccess: (p0) {},
onError: (p0, data) {
log("Errr++ p0 $data ");
},
),
);
log(
"evaluationResult ${evaluationResult?.reason} ${evaluationResult?.isEnabled}",
);
setState(() {
//
});
await flagDeckSdk.evaluateBatch(
FlagdeckBatchRequestData(
flagKeys: ['match-day', 'match-day-r', 'atl-madrid', 'atl-madride'],
onError: (p1, data) {
log("Errr++ p1 $data");
},
),
);
// setState(() {
// //
// });
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('Number of flags:'),
Text(
flagDeckSdk.length.toString(),
style: Theme.of(context).textTheme.headlineMedium,
),
SizedBox(height: 80),
const Text('Number of events:'),
Text(
flagDeckSdk.flagDeckEventLogger.events.length.toString(),
style: Theme.of(context).textTheme.headlineMedium,
),
Column(
children:
flagDeckSdk.flagDeckEventLogger.events
.map(
(e) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:
e
.toJson()
.entries
.map(
(e) => Column(
children: [
Text(
"${e.key}: ${e.value}",
style:
Theme.of(
context,
).textTheme.bodyMedium,
),
SizedBox(height: 2),
],
),
)
.toList(),
),
)
.toList()
.asMap()
.entries
.map(
(e) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Event: ${e.key + 1}',
style: Theme.of(context).textTheme.headlineLarge,
),
e.value,
SizedBox(height: 30),
],
),
)
.toList(),
),
],
),
),
floatingActionButton: SpeedDial(
animatedIcon: AnimatedIcons.menu_close,
backgroundColor: Colors.blue,
children: [
SpeedDialChild(
child: Icon(Icons.add),
label: "Add Flag",
onTap: addFlag,
),
SpeedDialChild(
child: Icon(Icons.send),
label: "Send Logs to server ",
onTap: sendToServer,
),
SpeedDialChild(
child: Icon(Icons.online_prediction),
label: "SSE Connected",
onTap: checkSSE,
),
],
),
);
}
}