Выпадающее меню с тремя кнопками
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
19
lib/db.dart
19
lib/db.dart
@@ -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);
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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() {
|
||||
@@ -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;
|
||||
@@ -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() {
|
||||
@@ -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());
|
||||
});
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
// В случае, если в приложении отсутствует токен,
|
||||
Reference in New Issue
Block a user