~~NOCACHE~~ ~~REVEAL night~~ ---->> # flutter with firebase, mobx {{tag>flutter firebase mobx}} ----> ## 환경 설정 \\ 1. firebase 설정 2. flutter 설정 3. mobx 설정 ---->> # firebase 홈페이지: https://firebase.google.com/?hl=ko 사용하는 이유는 `서버 걱정 없이 개발` 할 수 있습니다. 개발용도 정도의 사용량은 무료로 가능하며, 이용자가 많아지면 돈만 내면 됩니다. ![](http://snappyimages.nextwavesrl.netdna-cdn.com/img/f1e2cb51f008170fb32fd74fbe01ad58.png?800) ----> ## firebase 프로젝트 생성 [firebase 콘솔](https://console.firebase.google.com/?hl=ko&pli=1)에서 프로젝트를 생성합니다. url : https://console.firebase.google.com/?hl=ko&pli=1 ![](http://snappyimages.nextwavesrl.netdna-cdn.com/img/04c63fa08ba676bdc5a58249184cc4ee.png?500) ----> ### 앱 추가 \\ \\ ![](http://snappyimages.nextwavesrl.netdna-cdn.com/img/dcbfa3b2aa34050c7cccc49911eb171c.png?300) ----> ### google-services.json 다운로드 ![](http://snappyimages.nextwavesrl.netdna-cdn.com/img/35f88913588181528d42dc0371d1dcc0.png?800) ----> ### google-services.json 파일 복사 ![](http://snappyimages.nextwavesrl.netdna-cdn.com/img/1985a8939a0259d16bf17a69acd253e7.png?300) [project_name]/android/app 으로 \\ \\ 다운받은 \\ \\ `google-services.json` 파일을 복사 합니다. ---->> ## flutter 설정 1. 프로젝트 생성 2. android/build.gradle 수정 3. android/app/build.gradle 수정 4. android/gradle.properties 수정 5. pubspec.yaml 수정 ----> ### flutter 프로젝트 생성 \\ https://flutter.dev/docs/get-started/install 에서 다운받아 설치합니다. \\ ```shell flutter create [project_name] ``` ----> ### android/build.gradle 파일 변경 ```javascript buildscript { ext.kotlin_version = '1.2.71' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.2' <------- `추가` } } ``` ----> ### android/app/build.gradle 변경 ```javascript defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.rmaru.mart" <----- firebase app 이름과 동일하게 설정 minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } ``` 맨 밑에 추가 ```javascript apply plugin: 'com.google.gms.google-services' ``` ----> ### android/gradle.properties 수정 AndroidX 사용 설정 합니다. ``` org.gradle.jvmargs=-Xmx1536M android.enableJetifier=true android.useAndroidX=true ``` ----> ### pubspec.yaml 수정 \\ - `firebase_core` - `firebase_database` 를 추가합니다. \\ ```javascript dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.2 firebase_core: ^0.4.0 firebase_database: ^3.0.7 ``` ---->> ## MobX \\ 플러터에서 상태관리를 위해 `mobx`를 사용합니다. \\ (다른것을 사용할 수도 있습니다) \\ - https://mobx.pub/getting-started ----> ### MobX 관련 패키지 추가 pubspec.yaml ```javascript dependencies: ... provider: ^3.1.0+1 mobx: ^0.3.9+1 flutter_mobx: ^0.3.3+1 ... dev_dependencies: ... build_runner: ^1.7.2 mobx_codegen: ^0.3.10 ``` ----> ### store 파일 생성 lib/store/counter_store.dart ```dart import 'package:mobx/mobx.dart'; // Include generated file part 'counter_store.g.dart'; // This is the class used by rest of your codebase class CounterStore = _CounterStore with _$CounterStore; // The store-class abstract class _CounterStore with Store { @observable int value = 0; @action void increment() { value++; } } ``` ----> ### build run \\ 커맨드창에서 실행하면 `counter_store.g.dart` 파일이 생성됩니다. \\ ```shell flutter packages pub run build_runner build ``` ![](http://snappyimages.nextwavesrl.netdna-cdn.com/img/62cf02106d615fac64964739bc020b7a.png) ----> ### store 생성 & provider로 전달 ```dart import 'package:flutter/material.dart'; import 'package:mart_firebase/screen/home_screen.dart'; import 'package:mart_firebase/store/counter_store.dart'; import 'package:provider/provider.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MultiProvider( providers: [ Provider(builder: (_) => CounterStore()), // Provider(builder: (_) => SearchStore()), ], child: MaterialApp( title: 'Flutter Demo', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.green, backgroundColor: Colors.grey, ), home: HomeScreen(), // home: SearchResultScreen(), )); } } ``` ----> ### store 사용 ```dart import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:mart_firebase/store/counter_store.dart'; import 'package:provider/provider.dart'; class HomeScreen extends StatefulWidget { @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State { CounterStore _counterStore; // <--- 클래스 변수 선언 void _increment() { _counterStore.incrementTimes(2); } @override Widget build(BuildContext context) { _counterStore = Provider.of(context); // <--- 스토어 할당 return Scaffold( appBar: AppBar( title: Text('main screen'), ), body: Column( children: [ RaisedButton( onPressed: () { _counterStore.increment(); // <--- 스토어 액션 호출 }, child: Text('Increase', style: TextStyle(fontSize: 20)), ), RaisedButton( onPressed: _increment, child: Text('increment * 2'), ), Observer( builder: (context) => Text('${_counterStore.value}'), // <--- 스토어 값 사용 ) ], )); } } ``` ---->> ## Ref - https://github.com/DeveloperLibs/flutter_firebase_database/blob/master/pubspec.yaml \\