Smoth screen changes. Step 1
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:checker/base/base_screen.dart';
|
||||
import 'package:checker/base/base_state.dart';
|
||||
import 'package:checker/common.dart';
|
||||
import 'package:checker/consts.dart';
|
||||
@@ -8,91 +9,37 @@ import 'package:checker/db.dart';
|
||||
import 'package:checker/network.dart';
|
||||
import 'package:checker/resources.dart';
|
||||
import 'package:checker/screens/finish_registration.dart';
|
||||
import 'package:checker/screens/purchase.dart';
|
||||
import 'package:checker/screens/registration.dart';
|
||||
import 'package:checker/screens/settings.dart';
|
||||
import 'package:checker/strings.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:http/http.dart';
|
||||
|
||||
class SplashScreen extends StatefulWidget {
|
||||
class SplashScreen extends BaseScreen {
|
||||
|
||||
SplashScreen(SqliteHelper helper, String app) : super(helper, app);
|
||||
|
||||
@override
|
||||
State createState() => new _SplashScreenState();
|
||||
State createState() => new _SplashScreenState(helper, app);
|
||||
}
|
||||
|
||||
class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
|
||||
_SplashScreenState(SqliteHelper helper, String app) : super(helper, app);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext ctx) {
|
||||
if (helper == null) {
|
||||
helper = new SqliteHelper();
|
||||
helper.open().then((_) {
|
||||
if (app == null) {
|
||||
platform.invokeMethod('getFlavor').then((flavor) {
|
||||
app = flavor;
|
||||
setState(() {
|
||||
onStart();
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
return getScreenContent();
|
||||
}
|
||||
|
||||
void onStart() {
|
||||
helper.getLocale().then((locale) {
|
||||
if (locale == null) {
|
||||
initWithSystemValue();
|
||||
} else {
|
||||
initWithSavedValue(locale);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void initWithSystemValue() {
|
||||
platform.invokeMethod('getLocale').then((locale) {
|
||||
helper.getSettings(false).then((settings) {
|
||||
if (settings == null) {
|
||||
createSettingsTable(locale);
|
||||
} else {
|
||||
initLocale(locale, () {
|
||||
showNext();
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void initWithSavedValue(String locale) {
|
||||
initLocale(locale, () {
|
||||
showNext();
|
||||
});
|
||||
}
|
||||
|
||||
void createSettingsTable(String locale) {
|
||||
platform.invokeMethod('getCurrency').then((currency) {
|
||||
helper.createAppInfo(currency);
|
||||
initLocale(locale, () {
|
||||
showNext();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void initLocale<T>(String locale, Future<T> onValue()) {
|
||||
StringsLocalization.load(locale).then((_) {
|
||||
onValue();
|
||||
});
|
||||
}
|
||||
|
||||
void showNext() {
|
||||
new Future.delayed(const Duration(milliseconds: 1000), () {
|
||||
showNextScreen();
|
||||
});
|
||||
return getScreenContent();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget getScreenContent() {
|
||||
return app == null
|
||||
? getBackground()
|
||||
: new Stack(children: <Widget>[
|
||||
return new Stack(children: <Widget>[
|
||||
getBackground(),
|
||||
getLogo(),
|
||||
new Align(
|
||||
@@ -148,7 +95,9 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
bool active = status['active'] == null ? false : status['active'];
|
||||
|
||||
if (active) {
|
||||
startScanner(context, app, helper);
|
||||
helper.getToken().then((token) {
|
||||
_initAndStartScanner(context, app, token, helper);
|
||||
});
|
||||
} else {
|
||||
if (await platform.invokeMethod('isOnline')) {
|
||||
_createToken(helper);
|
||||
@@ -193,4 +142,101 @@ class _SplashScreenState extends BaseState<SplashScreen> {
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// Запуск спецефичной для каждой платформы части приложения - сканера.
|
||||
/// Может производиться с нескольких экранов (splash, finish_registration).
|
||||
_initAndStartScanner(BuildContext context, String app, String token,
|
||||
SqliteHelper helper) {
|
||||
// Канал ловит вызовы методов из "нативной" части приложения.
|
||||
// Могут быть вызваны либо exit либо faq, либо purchase.
|
||||
platform.setMethodCallHandler((MethodCall call) {
|
||||
if (call.method == 'findUser') {
|
||||
String cardPhone = call.arguments[0];
|
||||
var userResponse = getUser(call.arguments[1], cardPhone, token);
|
||||
|
||||
if (userResponse != null) {
|
||||
userResponse.then((response) {
|
||||
List<Map> users;
|
||||
|
||||
try {
|
||||
users = JSON.decode(response.body);
|
||||
} catch (error) {
|
||||
print(error);
|
||||
}
|
||||
|
||||
if (users.length > 0) {
|
||||
return users[0];
|
||||
} else {
|
||||
throw new FlutterError("Users not found");
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (call.method == 'faq') {
|
||||
faq(helper, app, context, true);
|
||||
} else if (call.method == 'settings') {
|
||||
pushRoute(context, new SettingsScreen(helper, app, true));
|
||||
} else {
|
||||
String userString;
|
||||
|
||||
if (call.arguments[0] is String) {
|
||||
userString = call.arguments[0];
|
||||
} else {
|
||||
userString = JSON.encode(call.arguments[0]);
|
||||
}
|
||||
|
||||
print(userString);
|
||||
|
||||
String card = call.arguments[1];
|
||||
print('$userString, $card');
|
||||
|
||||
new Future.delayed(const Duration(milliseconds: 200), () {
|
||||
var route = new MaterialPageRoute<bool>(
|
||||
builder: (BuildContext context) => new PurchaseScreen(helper, app, userString, card),
|
||||
fullscreenDialog: true);
|
||||
Navigator.of(context).push(route).then((b) {
|
||||
if (b) {
|
||||
setState(() {
|
||||
print('restart scanner!');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
platform.invokeMethod('getEndpoint').then((url) {
|
||||
platform.invokeMethod('getAppToken').then((appToken) {
|
||||
Map<String, String> args = StringsLocalization.strings;
|
||||
args['token'] = token;
|
||||
args['url'] = url;
|
||||
args['appToken'] = appToken;
|
||||
args['localeCode'] = StringsLocalization.localeCode;
|
||||
args['color'] = Resources
|
||||
.getPrimaryColor(app)
|
||||
.value
|
||||
.toString();
|
||||
platform.invokeMethod('startScanner', args);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Future<Response> getUser(String type, String cardPhone, String token) {
|
||||
try {
|
||||
switch (type) {
|
||||
case 'card':
|
||||
return getUserByCard(cardPhone, token);
|
||||
break;
|
||||
case 'phone':
|
||||
return getUserByPhone(cardPhone, token);
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
print(error.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user