Category: Dart

Firebase Analytics for Flutter

Firebaseコンソールにて

  • アプリ登録
  • パッケージとハッシュを入力。ハッシュ必須
  • googleさんから頂いたgoogle-services.jsonファイルをプロジェクトにイン!
    • google-services.json >> [project > android > app > google-services.json]

gradleに追加

  • 指示がでたとーりにproject > android以下のbuild.gradleを修正
...
buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.google.gms:google-services:3.1.2'// add
    }
}
...
...
//add to last of build.gradle
apply plugin: 'com.google.gms.google-services'

pubspec.yamlにプラグインを追加

...
dependencies:
  flutter:
    sdk: flutter

  firebase_analytics: ^0.3.0
...

importは analyticsとanalytics observer

  • あとFutureが帰ってくるので、import 'dart:async';も必要になる
...
    import 'dart:async';
	import 'package:firebase_analytics/firebase_analytics.dart';
	import 'package:firebase_analytics/observer.dart';
...

初期化処理

FirebaseAnalytics analytics = new FirebaseAnalytics();// add

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: <NavigatorObserver>[
        new FirebaseAnalyticsObserver(analytics: analytics)// add
      ],
      home: new MyHomePage(title: 'Flutter Demo Home Page', analytics: analytics),
    );
  }
}

使い方(すごく適当)

//for example to log
	//自由なイベント名でログを送信
    analytics.logEvent(name: "click_float");

	//パラメータにMapを追加してログを送信
	analytics.logEvent(name: "login_account", parameters: {"account": _googleSignIn.currentUser.email});

	//もともと用意されているイベント名を利用
	//例えばloginイベント
	analytics.logLogin();

動かないとき

  • package名!
  • ハッシュ!
  • build.gradle!2つとも!

Firebase > Analytics > DebugViewで見たいなら

adb -s [device] shell setprop debug.firebase.analytics.app [com.yourdomain.yourpackagename]


この記事のトラックバック用URL - http://mashi.exciton.jp/archives/329/trackback



FlutterのState, StatefulWidget, setState()について

StatefulWidget

  • StatefulWidgetがStateを内包する。
  • 状態を表す変数(ここではhogehoge)はStatefulWidgetではなくてStateが持つ
  • ここではbuild()もかかない
class MyWidget extends StatefulWidget {
  @override
  MyState createState() => new MyState();
}

 

 

State

  • StateはStatefulWidget(のサブクラス)ジェネリクスを持つStateを継承する
  • 状態を表す変数を持つ
  • レイアウトを構築するbuild関数をもつ。StatefulWidgetじゃなくてStateがレイアウトを構成する!
class MyState extends State<MyWidget> {
  int _hogehoge = 0; //状態を表す変数

  Widget build(BuildContext context) {
    return new Text("hogehoge is ${_hogehoge}");
  }
}

 

  • なんとなくStatefulWidgetがbuildをもっててレイアウトを構成していたほうが自然な感じはするが、オフィシャルではこういうやり方。

 

 

状態が変化した場合

  • StateのなかでsetStateを呼ぶ
  • 変数を変更してからsetState();しちゃいかんよ!
  • setStateに変数を変更するfunctionを渡すんだ!
class MyState extends State<MyWidget> {
  int _hogehoge = 0; //状態を表す変数

  void functionCalledByAnyone(){
    setState(() {
      _hogehoge += 1
    });
  }

  Widget build(BuildContext context) {
    return new Text("hogehoge is ${_hogehoge}");
  }
}

 

  • setStateについては変数を変更する前後でチェックが入ったり、適切なタイミングで変数の変更が行われるために、このような呼び方になっているみたい。
  • とはいっても、現状でこの程度のコードであれば何もしないfunction渡しちゃっても、別にフツーに動く。
  void functionCalledByAnyone(){
    _hogehoge += 1
    setState((){});
  }

 


どこのだれが変数を変更するか?


この記事のトラックバック用URL - http://mashi.exciton.jp/archives/268/trackback