diff --git a/android/app/build.gradle b/android/app/build.gradle index 97991ca..b27f11c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -22,6 +22,7 @@ if (flutterVersionName == null) { } apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" @@ -44,10 +45,11 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "ru.sacmi.temperature_viewer" - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true } buildTypes { @@ -65,4 +67,5 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:multidex:1.0.3' } diff --git a/android/build.gradle b/android/build.gradle index ed45c65..fd01d85 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,6 +8,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.google.gms:google-services:4.3.8' } } diff --git a/lib/main.dart b/lib/main.dart index 7cac02e..c646c30 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,7 +17,7 @@ void main() async { initializeDateFormatting('ru_RU', null); final cloudMessaging = CloudMessaging(); - await cloudMessaging.initialize(); + cloudMessaging.initialize(); runApp(MyApp()); } diff --git a/lib/presentation/route/app_route.dart b/lib/presentation/route/app_route.dart index 61685a8..55fba0e 100644 --- a/lib/presentation/route/app_route.dart +++ b/lib/presentation/route/app_route.dart @@ -6,7 +6,7 @@ import 'package:temperature_viewer/logic/cubit/sensor_detail/sensor_detail_cubit import 'package:temperature_viewer/logic/cubit/sensors_list/sensor_list_cubit.dart'; import 'package:temperature_viewer/logic/cubit/settings/settings_cubit.dart'; import 'package:temperature_viewer/presentation/view/sensor_data_view.dart'; -import 'package:temperature_viewer/presentation/view/sensor_detail.dart'; +import 'package:temperature_viewer/presentation/view/sensor_detail_view.dart'; import 'package:temperature_viewer/presentation/view/sensor_list_view.dart'; import 'package:temperature_viewer/presentation/view/settings_view.dart'; diff --git a/lib/presentation/view/sensor_detail.dart b/lib/presentation/view/sensor_detail.dart deleted file mode 100644 index 4119ac7..0000000 --- a/lib/presentation/view/sensor_detail.dart +++ /dev/null @@ -1,97 +0,0 @@ -// ignore_for_file: unused_import - -import 'dart:developer'; - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:temperature_viewer/logic/cubit/sensor_detail/sensor_detail_cubit.dart'; - -class SensorDetailView extends StatelessWidget { - final int sensorId; - - final maxTempController = TextEditingController(); - final minTempController = TextEditingController(); - final sendDelayController = TextEditingController(); - final updateDelayController = TextEditingController(); - final labelController = TextEditingController(); - - SensorDetailView({required this.sensorId, Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Настройка датчика'), - ), - body: Padding( - padding: const EdgeInsets.all(8), - child: BlocBuilder( - builder: (context, state) { - if (state is SensorDetailLoading) { - if (state is SensorDetailInitialLoading) { - BlocProvider.of(context) - .getSensorDetail(sensorId: sensorId); - } - - return const Center( - child: CircularProgressIndicator(), - ); - } else if (state is SensorDetailFailure) { - return const Center( - child: Text('Не удалось получить данные'), - ); - } else if (state is SensorDetailLoaded) { - labelController.text = state.sensorDetail.label; - minTempController.text = state.sensorDetail.minTemp.toString(); - maxTempController.text = state.sensorDetail.maxTemp.toString(); - sendDelayController.text = - state.sensorDetail.sendDelay.toString(); - updateDelayController.text = - state.sensorDetail.updateDelay.toString(); - - return ListView( - children: [ - TextField( - controller: labelController, - decoration: - const InputDecoration(labelText: 'Название датчика')), - TextField( - controller: minTempController, - decoration: const InputDecoration( - labelText: 'Минимальная температура')), - TextField( - controller: maxTempController, - decoration: const InputDecoration( - labelText: 'Максимальная температура')), - TextField( - controller: sendDelayController, - decoration: const InputDecoration( - labelText: 'Интервал отправки показаний')), - TextField( - controller: updateDelayController, - decoration: const InputDecoration( - labelText: 'Интервал проверки настроек')), - ListTile( - title: const Text('Сохранить'), - leading: const Icon(Icons.save), - onTap: () { - context.read().updateSensorDetail( - sensorId: sensorId, - label: labelController.text, - minTemp: double.parse(minTempController.text), - maxTemp: double.parse(maxTempController.text), - sendDelay: int.parse(sendDelayController.text), - updateDelay: int.parse(updateDelayController.text)); - }, - ) - ], - ); - } else { - return const Text('???'); - } - }, - ), - ), - ); - } -} diff --git a/lib/presentation/view/sensor_detail_view.dart b/lib/presentation/view/sensor_detail_view.dart new file mode 100644 index 0000000..f71ccad --- /dev/null +++ b/lib/presentation/view/sensor_detail_view.dart @@ -0,0 +1,93 @@ +// ignore_for_file: unused_import + +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:temperature_viewer/logic/cubit/sensor_detail/sensor_detail_cubit.dart'; + +class SensorDetailView extends StatelessWidget { + final int sensorId; + + final maxTempController = TextEditingController(); + final minTempController = TextEditingController(); + final sendDelayController = TextEditingController(); + final updateDelayController = TextEditingController(); + final labelController = TextEditingController(); + + SensorDetailView({required this.sensorId, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Настройка датчика'), + ), + body: BlocBuilder( + builder: (context, state) { + if (state is SensorDetailLoading) { + if (state is SensorDetailInitialLoading) { + BlocProvider.of(context) + .getSensorDetail(sensorId: sensorId); + } + + return const Center( + child: CircularProgressIndicator(), + ); + } else if (state is SensorDetailFailure) { + return const Center( + child: Text('Не удалось получить данные'), + ); + } else if (state is SensorDetailLoaded) { + labelController.text = state.sensorDetail.label; + minTempController.text = state.sensorDetail.minTemp.toString(); + maxTempController.text = state.sensorDetail.maxTemp.toString(); + sendDelayController.text = state.sensorDetail.sendDelay.toString(); + updateDelayController.text = + state.sensorDetail.updateDelay.toString(); + + return ListView( + children: [ + TextField( + controller: labelController, + decoration: + const InputDecoration(labelText: 'Название датчика')), + TextField( + controller: minTempController, + decoration: const InputDecoration( + labelText: 'Минимальная температура')), + TextField( + controller: maxTempController, + decoration: const InputDecoration( + labelText: 'Максимальная температура')), + TextField( + controller: sendDelayController, + decoration: const InputDecoration( + labelText: 'Интервал отправки показаний')), + TextField( + controller: updateDelayController, + decoration: const InputDecoration( + labelText: 'Интервал проверки настроек')), + ListTile( + title: const Text('Сохранить'), + leading: const Icon(Icons.save), + onTap: () { + context.read().updateSensorDetail( + sensorId: sensorId, + label: labelController.text, + minTemp: double.parse(minTempController.text), + maxTemp: double.parse(maxTempController.text), + sendDelay: int.parse(sendDelayController.text), + updateDelay: int.parse(updateDelayController.text)); + }, + ) + ], + ); + } else { + return const Text('???'); + } + }, + ), + ); + } +} diff --git a/lib/presentation/view/settings_view.dart b/lib/presentation/view/settings_view.dart index 714c6ee..261b2b1 100644 --- a/lib/presentation/view/settings_view.dart +++ b/lib/presentation/view/settings_view.dart @@ -19,15 +19,20 @@ class SettingsView extends StatelessWidget { ), body: ListView( children: [ - TextField( - controller: textController, - decoration: const InputDecoration(labelText: 'Хост'), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: textController, + decoration: const InputDecoration(labelText: 'Хост'), + ), + ), + ListTile( + title: const Text('Сохранить'), + leading: const Icon(Icons.save), + onTap: () { + settingsCubit.setUrl(textController.text); + }, ), - ElevatedButton( - onPressed: () { - settingsCubit.setUrl(textController.text); - }, - child: const Text('Save')) ], ), );