Выпадающее меню с тремя кнопками

This commit is contained in:
Ivan Murashov
2017-09-08 11:01:42 +03:00
parent c703977651
commit c652276066
17 changed files with 111 additions and 94 deletions

View File

@@ -1,5 +1,3 @@
import 'dart:async';
import 'package:checker/resources.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -7,10 +5,12 @@ import 'package:intl/intl.dart';
import 'common.dart';
import 'consts.dart';
import 'strings.dart';
import 'package:checker/db.dart';
abstract class BaseState<T extends StatefulWidget> extends State<T> {
SqliteHelper helper;
/// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки)
String app;
@@ -31,7 +31,10 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
platform.invokeMethod('getFlavor').then((flavor) {
setState(() {
app = flavor;
onStart();
helper = new SqliteHelper();
helper.open().then((_){
onStart();
});
});
});
}
@@ -57,7 +60,7 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
}
void onStart() {
print("ON START!");
}
/// Возвращает контейнер с всеми виджетами экрана.
@@ -72,7 +75,22 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
}
List<Widget> getMenuButtons() {
return <Widget>[getFaqButton()];
return <Widget>[
new PopupMenuButton(
itemBuilder: (BuildContext context) {
[
new PopupMenuItem(
child: new Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
new Image.asset(
settings_png, width: 48.0, height: 48.0),
new Image.asset(help_png, width: 48.0, height: 48.0),
new Image.asset(logout_png, width: 48.0, height: 48.0),
]))
];
}
)];
}
Widget getFaqButton() {

View File

@@ -1,13 +1,13 @@
import 'db.dart';
import 'package:flutter/services.dart';
import 'package:checker/screens/faq.dart';
import 'package:checker/screens/purchase.dart';
import 'package:checker/screens/registration.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'consts.dart';
import 'db.dart';
import 'network.dart';
import 'resources.dart';
import 'package:checker/registration.dart';
import 'package:checker/purchase.dart';
import 'faq.dart';
import 'strings.dart';
// Канал для взаимодействия с кодом платформы.
@@ -53,13 +53,18 @@ logout(BuildContext context) async {
showYesNoDialog(context, StringsLocalization.confirmation(), StringsLocalization.askChangeStore(), positiveCalback);
}
forceLogout(SqliteHelper helper, BuildContext context) async {
String token = await helper.getToken();
forceLogout(String token , BuildContext context) async {
deleteToken(token).then((response) {
print(response.body);
platform.invokeMethod('removeKeys').then((result) {
Navigator.of(context).pop();
pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию
SqliteHelper helper = new SqliteHelper();
helper.open().then((_) {
helper.clear().then((_) {
helper.close().then((_) {
Navigator.of(context).pop();
pushRoute(context, new RegistrationScreen()); // Запускаем регистрацию
});
});
});
}).catchError((error) {
print(error.toString());
@@ -79,7 +84,7 @@ startScanner(BuildContext context, String app, SqliteHelper helper) async {
print('call.method: ${call.method}');
if (call.method == 'logout') {
forceLogout(helper, context);
forceLogout(token, context);
} else if (call.method == 'faq') {
faq(context, true);
} else {

View File

@@ -8,11 +8,17 @@ const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08';
// Assets
const String logout_png = 'assets/logout.png';
const String help_png = 'assets/help.png';
const String settings_png = 'assets/settings.png';
const String activate_token_bg_png = 'assets/activate_token_message_background.png';
const String active_token_bg_png = 'assets/active_token_message_background.png';
const String expansion_icon_png = 'assets/expansion_icon.png';
const String expansion_icon_png = 'assets/faq_expansion_icon.png';
const String powered_by_dinect_splash_png = 'assets/powered_by_dinect_splash.png';
const String powered_by_dinect_png = 'assets/powered_by_dinect.png';
const String splash_text_png = 'assets/splash_text.png';
const Color greyTextColor = const Color(0xffa5a5a5);

View File

@@ -41,7 +41,8 @@ class SqliteHelper {
Map session = {
columnMerchantID: merchantID,
columnPosID: posID,
columnToken: token
columnToken: token,
columnDocID: 0
};
return db.insert(tableSession, session);
@@ -49,12 +50,16 @@ class SqliteHelper {
Future<String> getToken() async {
Map session = await _getSession();
return session != null ? session[columnToken] : null;
String token = session != null ? session[columnToken] : null;
print('token: {$token}');
return token;
}
Future<String> getMerchantID() async {
Map session = await _getSession();
return session != null ? session[columnMerchantID] : null;
String merchantID = session != null ? session[columnMerchantID] : null;
print('token: {$merchantID}');
return merchantID;
}
Future<String> getPosID() async {
@@ -62,6 +67,14 @@ class SqliteHelper {
return session != null ? session[columnPosID] : new DateTime.now().millisecondsSinceEpoch.toString();
}
Future<int> getDocID() async {
Map session = await _getSession();
int docID = session != null ? session[columnDocID] : 0;
db.update(tableSession, {columnDocID: docID + 1});
print('docid: {$docID}');
return docID;
}
Future<Map> _getSession() async {
List<Map> maps = await db.query(tableSession, columns: null);

View File

@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'splash.dart';
import 'package:checker/screens/splash.dart';
import 'consts.dart';
import 'strings.dart';
import 'common.dart';

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'base_state.dart';
import 'consts.dart';
import 'common.dart';
import 'package:checker/base_state.dart';
import 'package:checker/consts.dart';
import 'package:checker/common.dart';
/// Класс содержит заголовки и текст блоков FAQ.
class Entry {
@@ -68,7 +68,7 @@ class FAQScreenState<T> extends BaseState<FAQScreen> {
onWillPop() {
if(returnToScanner) {
return startScanner(context, app);
return startScanner(context, app, helper);
} else {
return true;
}

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:checker/db.dart';
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
import 'package:checker/common.dart';
@@ -15,23 +14,15 @@ class FinishRegistrationScreen extends StatefulWidget {
class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
SqliteHelper helper;
bool _tokenActive = false;
String _merchantID = '';
String _merchantID;
_RegistrationScreenState() {
helper = new SqliteHelper();
if (textFieldValue == "") {
helper.open().then((_){
helper.getMerchantID().then((result) {
setState(() {
_merchantID = result;
print('merchanID: ${_merchantID}');
});
});
@override void onStart() {
helper.getMerchantID().then((result) {
setState(() {
_merchantID = result;
});
}
});
}
@override String getTitle() {
@@ -39,7 +30,7 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
}
@override getHint() {
return StringsLocalization.idStore();
return _merchantID;
}
@override Widget getScreenContent() {

View File

@@ -3,13 +3,13 @@ import 'package:flutter/services.dart';
import 'dart:convert';
import 'dart:core';
import 'resources.dart';
import 'strings.dart';
import 'common.dart';
import 'consts.dart';
import 'network.dart';
import 'base_state.dart';
import 'purchase_success.dart';
import 'package:checker/resources.dart';
import 'package:checker/strings.dart';
import 'package:checker/common.dart';
import 'package:checker/consts.dart';
import 'package:checker/network.dart';
import 'package:checker/base_state.dart';
import 'package:checker/screens/purchase_success.dart';
/// Экран проведения покупки.
class PurchaseScreen extends StatefulWidget {
@@ -32,6 +32,9 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
PurchaseScreenState(String userString, String card) {
this.user = JSON.decode(userString);
this.card = card;
}
@override void onStart() {
getLoyalty(user['loyalty_url']);
}
@@ -69,7 +72,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
child: new Text(
title,
style: new TextStyle(color: textColor)),
onPressed: () => startScanner(context, app)),
onPressed: () => startScanner(context, app, helper)),
decoration: new BoxDecoration(
border: new Border.all(color: Resources.getButtonColor(app), width: 1.0),
borderRadius: new BorderRadius.all(new Radius.circular(4.0))));
@@ -109,7 +112,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
if (await platform.invokeMethod('isOnline')) {
String token = await sqliteHelper.getToken();
String token = await helper.getToken();
var headers = {
'DM-Authorization': 'dmapptoken $appToken',
@@ -199,8 +202,8 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
if (!purchaseInProgress) {
purchaseInProgress = true;
String token = await sqliteHelper.getToken();
platform.invokeMethod('getDocID').then((result) {
String token = await helper.getToken();
helper.getMerchantID().then((result) {
String url = user['purchases_url'];
@@ -219,8 +222,10 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
httpClient.post(url, body: body, headers: headers).then((response) {
print(response.body);
Navigator.of(context).pop();
pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
helper.close().then((_) {
Navigator.of(context).pop();
pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
});
}).catchError((error) {
purchaseInProgress = false;

View File

@@ -50,7 +50,7 @@ class PurchaseSuccessScreenState<T> extends BaseState<PurchaseSuccessScreen> {
getScanButton() {
String title = StringsLocalization.scan();
return buildRaisedButton(title, () => startScanner(context, app));
return buildRaisedButton(title, () => startScanner(context, app, helper));
}
getSuccessMessage() {

View File

@@ -1,5 +1,5 @@
import 'package:checker/db.dart';
import 'package:checker/finish_registration.dart';
import 'package:checker/screens/finish_registration.dart';
import 'package:flutter/material.dart';
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
@@ -72,8 +72,6 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
_register() async {
if (await platform.invokeMethod('isOnline')) {
SqliteHelper helper = new SqliteHelper();
await helper.open();
String posID = await helper.getPosID();
createToken(textFieldValue, posID).then((response) {
@@ -84,21 +82,20 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
});
print(response.body);
print(response.statusCode.toString());
Map parsedMap = JSON.decode(response.body);
if (response.statusCode == 201) {
helper.insert(textFieldValue, posID, parsedMap['token']);
helper.close();
pushRoute(context, new FinishRegistrationScreen());
helper.insert(textFieldValue, posID, parsedMap['token']).then((_) {
helper.close();
pushRoute(context, new FinishRegistrationScreen());
});
} else {
helper.close();
setState(() {
error = parsedMap['errors'][0];
});
}
}).catchError((error) {
helper.close();
print(error.toString());
});
}

View File

@@ -1,16 +1,15 @@
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:intl/intl.dart';
import 'dart:convert';
import 'dart:async';
import 'common.dart';
import 'network.dart';
import 'consts.dart';
import 'registration.dart';
import 'finish_registration.dart';
import 'db.dart';
import 'resources.dart';
import 'base_state.dart';
import 'package:checker/common.dart';
import 'package:checker/network.dart';
import 'package:checker/consts.dart';
import 'package:checker/resources.dart';
import 'package:checker/db.dart';
import 'package:checker/base_state.dart';
import 'package:checker/screens/registration.dart';
import 'package:checker/screens/finish_registration.dart';
class SplashScreen extends StatefulWidget {
@override State createState() => new _SplashScreenState();
@@ -37,7 +36,6 @@ class _SplashScreenState extends BaseState<SplashScreen> {
width: 122.0)))]);
}
@override Widget getMainWidget() {
return getScreenContent();
}
@@ -73,8 +71,6 @@ class _SplashScreenState extends BaseState<SplashScreen> {
/// Запуск следующего экрана приложения.
showNextScreen(BuildContext context) async {
SqliteHelper helper = new SqliteHelper();
await helper.open();
String token = await helper.getToken();
// В случае, если в приложении отсутствует токен,