import 'package:checker/resources.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; import 'common.dart'; import 'consts.dart'; import 'package:checker/db.dart'; abstract class BaseState extends State { SqliteHelper helper; /// Тип сборки. Определяет, какие брать ресурсы (цвета, картинки) String app; /// Ожидание ответа от сервера. bool loading = false; /// Текст ошибки, подставляется в подсказку, либо появляется над текстовым полем. String error; /// Введенное пользователем значение. String textFieldValue = ''; @override Widget build(BuildContext ctx) { platform.invokeMethod('getLocale').then((locale) { Intl.defaultLocale = locale; if (app == null) { platform.invokeMethod('getFlavor').then((flavor) { setState(() { app = flavor; helper = new SqliteHelper(); helper.open().then((_){ onStart(); }); }); }); } }); return getMainWidget(); } Widget getMainWidget() { return app == null ? getBackground() : new Scaffold(appBar: getAppBar(), body: new Stack(children: [ getScreenContent(), new Center(child: loading ? new CircularProgressIndicator() : null) ])); } Widget getBackground() { return new Container( decoration: new BoxDecoration( image: new DecorationImage( image: new ExactAssetImage(Resources.getSplash(app)), fit: BoxFit.cover))); } void onStart() { print("ON START!"); } /// Возвращает контейнер с всеми виджетами экрана. Widget getScreenContent(); /// Возвращает заголовок для AppBar String getTitle(); AppBar getAppBar() { return new AppBar(title: new Text(getTitle(), style: new TextStyle(fontSize: 18.0)), backgroundColor: Resources.getPrimaryColor(app), actions: getMenuButtons()); } List getMenuButtons() { return [ 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() { return new IconButton(icon: new Icon(Icons.help_outline), onPressed: () => faq(context, false)); } Widget getLogoutButton() { return new IconButton(icon: new Image.asset(logout_png, height: iconHeight, width: iconHeight), onPressed: () => logout(context)); } /// Возврвщает контейнер, внутри которого Text с подсказкой. Widget getHintLabel() { double horizontalMargin = 8.0; return new Container(margin: new EdgeInsets.only(top: horizontalMargin, bottom: horizontalMargin, left: verticalMargin, right: verticalMargin), child: new Row(crossAxisAlignment: CrossAxisAlignment.start, children: [new Text(getHintString(), textAlign: TextAlign.left, style: new TextStyle(fontWeight: FontWeight.w300, color: error == null ? greyTextColor : Resources.getLogo(app), fontSize: 14.0))])); } /// Возвращает подсказку, либо ошибку, если введенные в поле ввода данные неверны. String getHintString() { if (textFieldValue.length == 0 && error == null) { return ' '; } else if (error != null) { return error; } else { return getHint(); } } /// Возвращает текст подсказки для поля ввода. /// Должен быть переопределен на экранах, на которых есть поле ввода. String getHint() { return null; } /// Смена состояния экрана при изменении текста в поле ввода. void handleUserInput(String text) { setState(() { textFieldValue = text; }); } /// Метод возвращает контейнер с полем ввода внутри. Widget getInputField() { return new Container(margin: new EdgeInsets.only(left: verticalMargin, right: verticalMargin), padding: getInputFieldContainerPadding(), decoration: getInputFieldContainerDecoration(), child: getTextWidget()); } /// Возвращает поле ввода. /// Переопределяется для использования на экранах регистрации и проведения покупки. Widget getTextWidget() { return null; } /// Возвращат паддинги для поля ввода. EdgeInsets getInputFieldContainerPadding() { const double verticalPadding = 12.0; const double horizontalPadding = 16.0; return new EdgeInsets.only(top: verticalPadding, bottom: verticalPadding, left: horizontalPadding, right: horizontalPadding); } /// Метод возвращает BoxDecoration для _getDecoratedInputField BoxDecoration getInputFieldContainerDecoration() { return new BoxDecoration(color: inputFieldBackground, border: new Border.all(color: textBorderColor, width: 1.0), borderRadius: new BorderRadius.all(new Radius.circular(4.0))); } /// Возвращает выпуклую залитую фирменным цветом кнопку Widget buildRaisedButton(String text, VoidCallback onPressed) { return new RaisedButton(child: new Text(text, style: new TextStyle(color: Colors.white)), onPressed: onPressed, color: Resources.getButtonColor(app)); } /// Метод возвращает контейнер с отступами, который содержит картинку с логотипом. Widget getLogo() { double containerHeight = 92.0; double imageWidth = 156.0; return new Container(height: containerHeight, child: new Image.asset(Resources.getLogo(app), width: imageWidth)); } /// Возвращает текстовое поле, с однострочным пояснением над ним. Widget getValueWithDescription(String title, String value) { return new Container(padding: new EdgeInsets.only(left: verticalMargin, right: verticalMargin, top: 18.0), child: new Column(children: [ new Row(crossAxisAlignment: CrossAxisAlignment.start, children: getDescriptionWidget(title)), new Row(crossAxisAlignment: CrossAxisAlignment.start, children: getValueWidget(value)) ])); } /// Возвращает список, единственный элемент которого - Text с заголовком для текстового поля. List getDescriptionWidget(String title) { return [new Text(title, textAlign: TextAlign.left, style: new TextStyle(color: greyTextColor, fontSize: 14.0))]; } /// Возвращает список, единственный элемент которого - Text с информацией (размер скидки, сумма проведенной покупки). List getValueWidget(String value) { return [new Expanded(child: new Text(value, textAlign: TextAlign.left, style: new TextStyle(color: Colors.black, fontSize: 20.0)))]; } /// Возвращает кнопку, обернутую набором специфичных контейнеров. Widget wrapButton(EdgeInsets margin, Widget widget) { return new Container(margin: margin, height: buttonHeight, child: new Row(children: [new Expanded(child: widget)])); } }