Redux in home
This commit is contained in:
parent
cb71bb24b3
commit
3982bb525a
1 changed files with 111 additions and 71 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue