take this import 'dart:async';
import 'package:flutter/material.dart';
import 'package:growthbook_sdk_flutter/growthbook_sdk_flutter.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.dark,
home: const FeatureStreamWidget(),
);
}
}
class FeatureStreamWidget extends StatefulWidget {
const FeatureStreamWidget({super.key});
@override
_FeatureStreamWidgetState createState() => _FeatureStreamWidgetState();
}
class _FeatureStreamWidgetState extends State<FeatureStreamWidget> {
GrowthBookSDK? gb;
late StreamController<Map<String, dynamic>> _streamController;
void initState() {
super.initState();
_streamController = StreamController<Map<String, dynamic>>();
initializeSDK();
}
void initializeSDK() async {
gb = await GBSDKBuilderApp(
hostURL: ''',
apiKey: "",
rdt-notification-date
growthBookTrackingCallBack: (exp, rst) {},
backgroundSync: true,
).setRefreshHandler((updated) {
if (updated) {
_fetchFeatureData();
}
}).initialize();
await gb?.refresh().whenComplete(() => print(gb?.features().keys));
//await gb?.refreshCache().whenComplete(() => print(gb?.getFeatures().keys));
}
void _fetchFeatureData() async {
final feature = gb?.feature('rdt-notification-date').value;
print('//feature value = $feature');
_streamController.add(feature);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StreamBuilder<Map<String, dynamic>>(
stream: _streamController.stream,
builder: (BuildContext context,
AsyncSnapshot<Map<String, dynamic>> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (snapshot.hasError) {
return Center(
child: Text('Error: ${snapshot.error}'),
);
} else if (snapshot.hasData) {
Map<String, dynamic> featureData = snapshot.data!;
return Center(
child: Text(
'Feature data: ${featureData.toString()}',
style: const TextStyle(color: Colors.black),
),
);
} else {
return const Center(
child: Text('No data available.'),
);
}
},
),
);
}
@override
void dispose() {
_streamController.close();
super.dispose();
}
}