flutter_bucketeer 1.0.0 copy "flutter_bucketeer: ^1.0.0" to clipboard
flutter_bucketeer: ^1.0.0 copied to clipboard

outdated

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);
  }
}