Redux in home

This commit is contained in:
Vicente J. Ruiz Jurado 2018-08-13 08:25:53 +02:00
parent cb71bb24b3
commit 3982bb525a

View file

@ -7,9 +7,11 @@ import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:fires_flutter/models/fireNotification.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_simple_dependency_injection/injector.dart';
import 'package:redux/redux.dart';
import 'firesSpinner.dart';
import 'activeFires.dart';
import 'colors.dart';
import 'fireAlert.dart';
@ -19,6 +21,23 @@ import 'mainDrawer.dart';
import 'models/appState.dart';
import 'redux/actions.dart';
class _ViewModel {
final bool isLoaded;
_ViewModel({@required this.isLoaded});
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is _ViewModel &&
runtimeType == other.runtimeType &&
isLoaded == other.isLoaded;
@override
int get hashCode => isLoaded.hashCode;
}
class HomePage extends StatefulWidget {
static const String routeName = '/home';
@ -31,8 +50,8 @@ class HomePage extends StatefulWidget {
class _HomePageState extends State<HomePage> {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final Store<AppState> store = Injector.getInjector().get<Store<AppState>>();
final Connectivity _connectivity = new Connectivity();
final List<FireNotification> newNotifications = [];
// Platform messages are asynchronous, so we initialize in an async method.
Future<Null> initConnectivity() async {
@ -64,14 +83,14 @@ class _HomePageState extends State<HomePage> {
void initState() {
super.initState();
_firebaseMessaging.configure(onMessage: (Map<String, dynamic> message) {
debugPrint("onMessage in fireApp: $message");
debugPrint("onMessage in fireApp (isLoaded: ${store.state.isLoaded}): $message");
_showItemDialog(message, _notifForMessage(message));
}, onLaunch: (Map<String, dynamic> message) {
debugPrint("onLaunch: $message");
debugPrint("onLaunch (isLoaded: ${store.state.isLoaded}): $message");
_notifForMessage(message);
_navigateToItemDetail(message);
}, onResume: (Map<String, dynamic> message) {
debugPrint("onResume: $message");
debugPrint("onResume (isLoaded: ${store.state.isLoaded}): $message");
_notifForMessage(message);
_navigateToItemDetail(message);
});
@ -111,12 +130,29 @@ class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return new StoreConnector<AppState, _ViewModel>(
distinct: true,
converter: (store) {
bool isLoaded = store.state.isLoaded;
if (isLoaded && newNotifications.isNotEmpty) {
newNotifications.forEach((notif) {
store.dispatch(new AddFireNotificationAction(notif));
});
newNotifications.clear();
}
return new _ViewModel(
isLoaded: store.state.isLoaded
);
},
builder: (context, view) {
return new Scaffold(
key: _scaffoldKey,
drawer: new MainDrawer(context, HomePage.routeName),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton:
Column(mainAxisAlignment: MainAxisAlignment.end, children: <Widget>[
floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat,
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FloatingActionButton.extended(
elevation: 0.0,
onPressed: () {
@ -136,12 +172,14 @@ class _HomePageState extends State<HomePage> {
},
heroTag: 'notifyFire',
backgroundColor: fires600,
label: new Text(S.of(context).notifyAFire, style: _btnFont),
icon: const Icon(Icons.notifications_active, size: 32.0),
label: new Text(S.of(context).notifyAFire,
style: _btnFont),
icon:
const Icon(Icons.notifications_active, size: 32.0),
),
),
]),
body: new SafeArea(
body: !view.isLoaded? new FiresSpinner(): new SafeArea(
child: Center(
child: new CenteredColumn(children: <Widget>[
new Row(
@ -180,6 +218,7 @@ class _HomePageState extends State<HomePage> {
)))
])),
));
});
}
void _showDialog(String message) {
@ -259,7 +298,8 @@ class _HomePageState extends State<HomePage> {
} catch (e) {
debugPrint(e.toString());
}
if (notif != null) store.dispatch(new AddFireNotificationAction(notif));
if (notif != null)
newNotifications.add(notif);
return notif;
}
}