flutter_bucketeer 1.0.0
flutter_bucketeer: ^1.0.0 copied to clipboard
Bucketeer
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bucketeer/bucketeer.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:ua_client_hints/ua_client_hints.dart';
const keyUserId = 'key_user_id';
Future<Map<String, String>> userMap() async {
final uaData = await userAgentData();
return {
'platform': uaData.platform, // e.g.. 'Android'
'platformVersion': uaData.platformVersion, // e.g.. '10'
'device': uaData.device, // e.g.. 'coral'
'appName': uaData.package.appName, // e.g.. 'SampleApp'
'appVersion': uaData.package.appVersion, // e.g.. '1.0.0'
'packageName': uaData.package.packageName, // e.g.. 'jp.wasabeef.ua'
'buildNumber': uaData.package.buildNumber, // e.g.. '1'
};
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Bucketeer.instance
..initialize(
apiKey:
"6d3daa509911dcb133fa45050420153f18151fa28f892472b081698aedf60852",
endpoint: 'api-media.bucketeer.jp',
featureTag: 'Flutter',
debugging: true,
logSendingIntervalMillis: 3000,
logSendingMaxBatchQueueCount: 3,
pollingEvaluationIntervalMillis: 3000,
);
runApp(MyApp());
}
class MyApp extends StatelessWidget with WidgetsBindingObserver {
MyApp() {
Future(() async {
// Generate UserId for Demo
final prefs = await SharedPreferences.getInstance();
if (prefs.getString(keyUserId) == null) {
await prefs.setString(
keyUserId, 'demo-userId-${DateTime.now().millisecondsSinceEpoch}');
}
await Bucketeer.instance
.setUser(prefs.getString(keyUserId), userMap: await userMap());
});
}
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Bucketeer Demo'),
);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
Bucketeer.instance.start();
} else if (state == AppLifecycleState.paused) {
Bucketeer.instance.stop();
}
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final flagController = TextEditingController(text: 'bucketeer-feature-flag');
final goalController = TextEditingController(text: 'bucketeer-goal-id');
final userIdController =
TextEditingController(text: 'bucketeer-flutter-user-id');
Future<void> _getStringVariation(String featureId) async {
final result = await Bucketeer.instance
.getStringVariation(featureId, defaultValue: 'default value');
result.ifSuccess((data) {
print('getStringVariation: ${data}');
snackbar('getStringVariation', data);
});
}
Future<void> _getIntVariation(String featureId) async {
final result =
await Bucketeer.instance.getIntVariation(featureId, defaultValue: 0);
result.ifSuccess((data) {
print('getIntVariation: $data');
snackbar('getIntVariation', '$data');
});
}
Future<void> _getDoubleVariation(String featureId) async {
final result = await Bucketeer.instance
.getDoubleVariation(featureId, defaultValue: 0.0);
result.ifSuccess((data) {
print('getDoubleVariation: $data');
snackbar('getDoubleVariation', '$data');
});
}
Future<void> _getBoolVariation(String featureId) async {
final result = await Bucketeer.instance
.getBoolVariation(featureId, defaultValue: false);
result.ifSuccess((data) {
print('getBoolVariation: $data');
snackbar('getBoolVariation', '$data');
});
}
Future<void> _sendGoal(String goalId) async {
final result = await Bucketeer.instance.track(goalId, value: 3.1412);
if (result.isSuccess) {
print('Successful the send goal.');
snackbar('sendGoal', 'Successful the send goal.');
} else {
print('Failed the send goal.');
snackbar('sendGoal', 'Failed the send goal.');
}
}
Future<void> _switchUser(String userId) async {
final result =
await Bucketeer.instance.setUser(userId, userMap: await userMap());
result.ifSuccess((data) {
print('Successful the setUser');
snackbar('setUser', 'Successful the setUser');
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24.0),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(height: 36.0),
Text(
'Feature Flag Id',
style: TextStyle(fontWeight: FontWeight.bold),
),
TextFormField(
controller: flagController,
decoration:
InputDecoration(hintText: 'bucketeer-feature-flag'),
),
const SizedBox(height: 12),
Text('GET VARIATION',
style: TextStyle(fontWeight: FontWeight.bold)),
Wrap(
spacing: 8,
children: [
RaisedButton(
child: Text('GET String param'),
onPressed: () async {
await _getStringVariation(flagController.text);
}),
RaisedButton(
child: Text('GET int param'),
onPressed: () async {
await _getIntVariation(flagController.text);
}),
RaisedButton(
child: Text('GET double params'),
onPressed: () async {
await _getDoubleVariation(flagController.text);
}),
RaisedButton(
child: Text('GET bool params'),
onPressed: () async {
await _getBoolVariation(flagController.text);
}),
],
),
SizedBox(height: 36.0),
Text(
'Goal Id',
style: TextStyle(fontWeight: FontWeight.bold),
),
TextFormField(
controller: goalController,
decoration: InputDecoration(hintText: 'bucketeer-goal-id'),
),
RaisedButton(
child: Text('SEND GOAL'),
onPressed: () async {
await _sendGoal(flagController.text);
}),
SizedBox(height: 36.0),
Text(
'User Id',
style: TextStyle(fontWeight: FontWeight.bold),
),
TextFormField(
controller: userIdController,
decoration:
InputDecoration(hintText: 'bucketeer-flutter-user-id'),
),
RaisedButton(
child: Text('SWITCH USER'),
onPressed: () async {
await _switchUser(flagController.text);
}),
],
),
),
),
),
),
);
}
void snackbar(String title, String message) {
Get.snackbar(title, message, snackPosition: SnackPosition.BOTTOM);
}
}