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

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

Before

Width:  |  Height:  |  Size: 173 B

After

Width:  |  Height:  |  Size: 173 B

BIN
assets/help.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
assets/settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="checker" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="FLUTTER_MODULE_TYPE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
<excludeFolder url="file://$MODULE_DIR$/.pub" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/packages" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>

View File

@@ -1,5 +1,3 @@
import 'dart:async';
import 'package:checker/resources.dart'; import 'package:checker/resources.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -7,10 +5,12 @@ import 'package:intl/intl.dart';
import 'common.dart'; import 'common.dart';
import 'consts.dart'; import 'consts.dart';
import 'strings.dart'; import 'package:checker/db.dart';
abstract class BaseState<T extends StatefulWidget> extends State<T> { abstract class BaseState<T extends StatefulWidget> extends State<T> {
SqliteHelper helper;
/// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки) /// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки)
String app; String app;
@@ -31,7 +31,10 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
platform.invokeMethod('getFlavor').then((flavor) { platform.invokeMethod('getFlavor').then((flavor) {
setState(() { setState(() {
app = flavor; 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() { void onStart() {
print("ON START!");
} }
/// Возвращает контейнер с всеми виджетами экрана. /// Возвращает контейнер с всеми виджетами экрана.
@@ -72,7 +75,22 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
} }
List<Widget> getMenuButtons() { 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() { Widget getFaqButton() {

View File

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

View File

@@ -8,11 +8,17 @@ const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08';
// Assets // Assets
const String logout_png = 'assets/logout.png'; 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 activate_token_bg_png = 'assets/activate_token_message_background.png';
const String active_token_bg_png = 'assets/active_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_splash_png = 'assets/powered_by_dinect_splash.png';
const String powered_by_dinect_png = 'assets/powered_by_dinect.png'; const String powered_by_dinect_png = 'assets/powered_by_dinect.png';
const String splash_text_png = 'assets/splash_text.png'; const String splash_text_png = 'assets/splash_text.png';
const Color greyTextColor = const Color(0xffa5a5a5); const Color greyTextColor = const Color(0xffa5a5a5);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -32,10 +32,12 @@ flutter:
- assets/autobonus_splash.png - assets/autobonus_splash.png
- assets/pip_splash.png - assets/pip_splash.png
- assets/settings.png
- assets/help.png
- assets/logout.png - assets/logout.png
- assets/activate_token_message_background.png - assets/activate_token_message_background.png
- assets/active_token_message_background.png - assets/active_token_message_background.png
- assets/expansion_icon.png - assets/faq_expansion_icon.png
- assets/powered_by_dinect_splash.png - assets/powered_by_dinect_splash.png
- assets/powered_by_dinect.png - assets/powered_by_dinect.png
- assets/autobonus_logo.png - assets/autobonus_logo.png