Compare commits

..

10 Commits

66 changed files with 993 additions and 454 deletions

5
.gitignore vendored
View File

@ -41,3 +41,8 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release
#keystore
clave-crcivan.jks
keystore-crcivan.jks
key.properties

View File

@ -4,6 +4,12 @@ plugins {
id "dev.flutter.flutter-gradle-plugin"
}
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
@ -14,26 +20,40 @@ if (localPropertiesFile.exists()) {
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
flutterVersionCode = '2'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
flutterVersionName = '1.1'
}
android {
namespace "com.example.flutter_project"
namespace "com.asociacionador.civan"
compileSdk flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
signingConfigs {
release {
keyAlias = keystoreProperties['keyAlias']
keyPassword = keystoreProperties['keyPassword']
storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword = keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig = signingConfigs.release
debuggable false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '1.8'
jvmTarget = JavaVersion.VERSION_17
}
sourceSets {
@ -42,21 +62,13 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.flutter_project"
applicationId "com.asociacionador.civan"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
versionCode 8
versionName "2.1"
}
}

View File

@ -1,10 +1,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flutter_project">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="flutter_project"
android:label="CRCivan"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round">
<activity
android:name=".MainActivity"

View File

@ -1,4 +1,4 @@
package com.example.flutter_project
package com.asociacionador.civan
import io.flutter.embedding.android.FlutterActivity

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground>
<inset
android:drawable="@drawable/ic_launcher_foreground"
android:inset="16%" />
</foreground>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip

View File

@ -19,8 +19,8 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
id "com.android.application" version "8.2.1" apply false
id "org.jetbrains.kotlin.android" version "2.1.10" apply false
}
include ":app"

BIN
assets/icon/app_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -368,7 +368,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject;
PRODUCT_BUNDLE_IDENTIFIER = com.asociacionador.civan;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@ -384,7 +384,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.asociacionador.civan.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -401,7 +401,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.asociacionador.civan.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@ -416,7 +416,7 @@
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject.RunnerTests;
PRODUCT_BUNDLE_IDENTIFIER = com.asociacionador.civan.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@ -427,7 +427,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@ -484,7 +484,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@ -547,7 +547,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject;
PRODUCT_BUNDLE_IDENTIFIER = com.asociacionador.civan;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -569,7 +569,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterProject;
PRODUCT_BUNDLE_IDENTIFIER = com.asociacionador.civan;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;

View File

@ -1,122 +1 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 572 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 999 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 783 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

After

Width:  |  Height:  |  Size: 999 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -3,7 +3,7 @@ import 'package:html/parser.dart' as htmlParser;
class DataService {
Future<List<Map<String, dynamic>>> obtenerDatos() async {
final response = await http.get(Uri.parse('http://www.crcivan.com/escaparate/noticias.cgi?idnoticias=192683'));
final response = await http.get(Uri.parse('https://crcivan.asociacionador.es/contenedores.html'));
if (response.statusCode == 200) {
final document = htmlParser.parse(response.body);
@ -28,4 +28,76 @@ class DataService {
throw Exception('Error al obtener datos');
}
}
Future<String> obtenerFechaComunicacionEmbalses() async {
final response = await http
.get(Uri.parse('https://crcivan.asociacionador.es/contenedores.html'));
if (response.statusCode == 200) {
final document = htmlParser.parse(response.body);
final dateElement =
document.querySelector('span[style="font-size: 12pt;"]');
final communicationDate = dateElement != null
? dateElement.text.replaceAll(':', '').trim()
: 'Fecha no encontrada';
return communicationDate;
} else {
throw Exception('Error al obtener la fecha de comunicación');
}
}
Future<Map<String, dynamic>> obtenerDatosSecciones() async {
final response = await http.get(Uri.parse('https://crcivan.asociacionador.es/secciones.html'));
if (response.statusCode == 200) {
final document = htmlParser.parse(response.body);
final rows = document.querySelectorAll('table[style="height: 1202px; font-size: 13px;"] tbody tr');
List<Map<String, dynamic>> seccionesData = [];
String? currentSection;
String? currentGuardInfo;
List<Map<String, String>> currentSectionData = [];
// Extraer la fecha de la comunicación
final dateRegex = RegExp(r'\d{2}/\d{2}/\d{4}');
final dateMatch = dateRegex.firstMatch(document.body!.text);
final communicationDate = dateMatch != null ? dateMatch.group(0) : 'Fecha no encontrada';
for (var row in rows) {
var cells = row.querySelectorAll('td');
if (cells.length == 2) {
var sectionElement = cells[1].querySelector('strong');
if (sectionElement != null && sectionElement.text.contains('SECCIÓN')) {
if (currentSection != null) {
seccionesData.add({
'section': currentSection,
'guardInfo': currentGuardInfo,
'data': currentSectionData,
});
}
currentSection = sectionElement.text.trim();
currentGuardInfo = cells[1].querySelector('span[style="text-decoration: underline;"]')?.text.trim();
currentSectionData = [];
} else {
currentSectionData.add({
'date': cells[0].text.trim(),
'location': cells[1].text.trim(),
});
}
}
}
if (currentSection != null) {
seccionesData.add({
'section': currentSection,
'guardInfo': currentGuardInfo,
'data': currentSectionData,
});
}
return {
'communicationDate': communicationDate,
'seccionesData': seccionesData,
};
} else {
throw Exception('Error al cargar los datos de secciones');
}
}
}

View File

@ -2,8 +2,6 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as htmlParser;
import 'package:html/dom.dart' as htmlDom;
import 'package:flutter_project/pages/embalses';
// Define el estado
class MyState {
@ -15,9 +13,9 @@ class MyBloc extends Cubit<MyState> {
MyBloc() : super(MyState());
}
//mejorar código
Future<List<String>> obtenerDatos() async {
final response = await http.get(Uri.parse('http://www.crcivan.com/escaparate/noticias.cgi?idnoticias=192683'));
final response = await http.get(Uri.parse('https://crcivan.asociacionador.es/contenedores.html'));
if (response.statusCode == 200) {
final document = htmlParser.parse(response.body);
final elementosSpan = document.querySelectorAll('html > body > div > center > table > tbody > tr > td > div > center > table > tbody > tr > td > table > tbody > tr > td > font > font > table > tbody > tr > td > span');
@ -29,7 +27,6 @@ Future<List<String>> obtenerDatos() async {
embalsesData.add(elemento.text);
}
}
return embalsesData;
} else {
throw Exception('Error al cargar los datos de embalses');
@ -52,3 +49,14 @@ Future<void> launchAemetURL() async {
throw Exception('Error al lanzar la URL de Aemet: $e');
}
}
Future<void> launchPrivacyPolicyURL() async {
const urlString = 'https://crcivan.asociacionador.es/politica-privacidad.html';
final url = Uri.parse(urlString);
try {
await launch(urlString);
} catch (e) {
throw Exception('Error al lanzar la URL de la política de privacidad: $e');
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

View File

@ -1,14 +1,26 @@
import 'package:flutter/material.dart';
import 'package:crcivan/pages/utils.dart'; // Importar la función global
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
const CustomAppBar({Key? key}) : super(key: key);
double _getIconSize(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width;
return screenWidth > 600 ? 40.0 : 32.0;
}
@override
Widget build(BuildContext context) {
double iconSize = _getIconSize(context);
return AppBar(
title: const Text(''),
centerTitle: true,
backgroundColor: Color.fromARGB(255, 78, 169, 6),
backgroundColor: const Color.fromARGB(255, 78, 169, 6),
iconTheme: IconThemeData(
color: Colors.white, // Cambia este color al que desees
size: iconSize, // Ajustar el tamaño del icono
),
flexibleSpace: Container(
padding: const EdgeInsets.all(8.0),
child: Center(
@ -16,8 +28,8 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
padding: const EdgeInsets.only(top: 10.0),
child: Image.asset(
'assets/logo-civan.png',
height: 200,
width: 200,
height: getResponsiveFontSize(context, 200.0), // Ajustar la altura de la imagen
width: getResponsiveFontSize(context, 200.0), // Ajustar el ancho de la imagen
),
),
),
@ -26,5 +38,5 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
}
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
Size get preferredSize => const Size.fromHeight(kToolbarHeight); // Tamaño fijo para el AppBar
}

View File

@ -1,43 +1,57 @@
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:crcivan/pages/utils.dart'; // Importar la función global
class CustomBottomBar extends StatelessWidget {
const CustomBottomBar({Key? key}) : super(key: key);
Future<void> _launchURL(String url) async {
try {
await launch(url);
} catch (e) {
// Captura de la excepción
print('An error occurred: $e');
try {
await launch(url);
} catch (e) {
// Captura de la excepción
print('An error occurred: $e');
}
}
}
@override
Widget build(BuildContext context) {
return BottomNavigationBar(
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.call),
label: 'Llamar',
return BottomAppBar(
child: Container(
height: getResponsiveFontSize(context, 80.0), // Ajustar la altura del BottomAppBar
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconButton(
icon: const Icon(Icons.call),
color: Colors.blue,
iconSize: getResponsiveFontSize(context, 24.0), // Ajustar el tamaño del icono
onPressed: () {
_launchURL('tel:+348766361379');
},
),
Expanded(
child: Text(
'Avenida Maella, 35 50700 Caspe (Zaragoza)',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: getResponsiveFontSize(context, 14.0),
fontWeight: FontWeight.bold,
),
),
),
IconButton(
icon: const Icon(Icons.email),
color: Colors.blue,
iconSize: getResponsiveFontSize(context, 24.0), // Ajustar el tamaño del icono
onPressed: () {
_launchURL('mailto:civan@crcivan.com');
},
),
],
),
BottomNavigationBarItem(
icon: Icon(Icons.email),
label: 'Correo',
),
],
selectedItemColor: Colors.blue,
unselectedItemColor: Colors.blue,
backgroundColor: const Color.fromARGB(255, 255, 255, 255),
currentIndex: 0,
onTap: (int index) {
if (index == 0) {
_launchURL('tel:+348766361379');
} else if (index == 1) {
_launchURL('mailto:civan@crcivan.com');
}
},
),
);
}
}

30
lib/main.dart Normal file
View File

@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:crcivan/BloC/contenedores_event.dart';
import '../pages/my_home_page.dart';
void main() {
runApp(
BlocProvider(
create: (context) => MyBloc(),
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color.fromARGB(255, 0, 67, 168)),
useMaterial3: true,
),
home: const MyHomePage(title: 'COMUNIDAD DE REGANTES DE CIVÁN'),
);
}
}

View File

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_project/BloC/contenedores_event.dart';
import 'package:crcivan/BloC/contenedores_event.dart';
import '../pages/my_home_page.dart';
@ -14,18 +14,17 @@ void main() {
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Color.fromARGB(255, 0, 67, 168)),
colorScheme: ColorScheme.fromSeed(seedColor: const Color.fromARGB(255, 0, 67, 168)),
useMaterial3: true,
),
home: const MyHomePage(title: 'COMUNIDAD DE REGANTES DE CIVÁN'),
);
}
//comentario
}

View File

@ -1,11 +1,13 @@
import 'package:flutter/material.dart';
import 'package:crcivan/BloC/DataService.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:flutter_project/BloC/DataService.dart';
import 'package:html/parser.dart' as htmlParser;
import 'package:flutter_project/BloC/contenedores_event.dart';
import 'package:flutter_project/bars/app_bar';
import 'package:flutter_project/widgets/background_widget.dart';
import 'package:flutter_project/bars/bottom_bar';
import 'package:html/dom.dart' as htmlDom;
import 'package:crcivan/bars/app_bar';
import 'package:crcivan/bars/bottom_bar';
import 'package:crcivan/widgets/background_widget.dart';
import 'package:crcivan/pages/utils.dart';
class EmbalsesPage extends StatefulWidget {
const EmbalsesPage({Key? key}) : super(key: key);
@ -16,6 +18,7 @@ class EmbalsesPage extends StatefulWidget {
class _EmbalsesPageState extends State<EmbalsesPage> {
final DataService dataService = DataService();
String communicationDate = '';
List<Map<String, dynamic>> embalsesData = [];
List<String> descripciones = ['Cota (m)', 'Volumen (Hm3)', 'Entrada (l/s)', 'Salida (l/s)'];
@ -23,6 +26,7 @@ class _EmbalsesPageState extends State<EmbalsesPage> {
void initState() {
super.initState();
obtenerDatos();
obtenerFechaComunicacion();
}
Future<void> obtenerDatos() async {
@ -36,73 +40,97 @@ class _EmbalsesPageState extends State<EmbalsesPage> {
}
}
Future<void> obtenerFechaComunicacion() async {
try {
final date = await dataService.obtenerFechaComunicacionEmbalses();
setState(() {
communicationDate = date;
});
} catch (e) {
print('Error: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const CustomAppBar(),
body: BackgroundWidget(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: ListView.builder(
itemCount: embalsesData.length,
itemBuilder: (context, index) {
final embalseData = embalsesData[index];
final nombreEmbalse = embalseData['nombre'];
final listaElementos = embalseData['elementos'];
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
communicationDate,
style: TextStyle(
fontSize: getResponsiveFontSize(context, 18.0),
fontWeight: FontWeight.bold,
),
),
),
Expanded(
child: ListView.builder(
itemCount: embalsesData.length,
itemBuilder: (context, index) {
final embalseData = embalsesData[index];
final nombreEmbalse = embalseData['nombre'];
final listaElementos = embalseData['elementos'];
return Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.5),
borderRadius: BorderRadius.circular(10.0),
),
child: Column(
children: [
Row(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
nombreEmbalse!,
style: const TextStyle(
fontSize: 25.0,
fontWeight: FontWeight.bold,
),
),
),
),
],
return Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.5),
borderRadius: BorderRadius.circular(10.0),
),
Row(
child: Column(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: List.generate(
listaElementos.length,
(index) => Text(
'${descripciones[index]}: ${listaElementos[index]}',
style: const TextStyle(
fontWeight: FontWeight.normal,
fontSize: 20.0,
Row(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
nombreEmbalse!,
style: TextStyle(
fontSize: getResponsiveFontSize(context, 25.0),
fontWeight: FontWeight.bold,
),
),
),
),
),
],
),
Row(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: List.generate(
listaElementos.length,
(index) => Text(
'${descripciones[index]}: ${listaElementos[index]}',
style: TextStyle(
fontWeight: FontWeight.normal,
fontSize: getResponsiveFontSize(context, 20.0),
),
),
),
),
),
),
],
),
],
),
],
),
),
);
},
),
),
);
},
),
),
],
),
),
bottomNavigationBar: const CustomBottomBar(),

View File

@ -1,16 +1,98 @@
import 'package:crcivan/BloC/contenedores_event.dart';
import 'package:flutter/material.dart';
import 'package:flutter_project/bars/app_bar';
import 'package:flutter_project/bars/bottom_bar';
import 'package:flutter_project/BloC/contenedores_event.dart';
import 'package:flutter_project/pages/noticias';
import 'package:flutter_project/pages/pregon';
import 'package:flutter_project/pages/embalses';
import 'package:flutter_project/widgets/background_widget.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:crcivan/bars/app_bar';
import 'package:crcivan/bars/bottom_bar';
import 'package:crcivan/pages/noticias';
import 'package:crcivan/pages/pregon';
import 'package:crcivan/pages/embalses';
import 'package:crcivan/pages/secciones';
import 'package:crcivan/widgets/background_widget.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:crcivan/pages/utils.dart'; // Importar la función global
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
verificarPrimerInicio();
}
Future<void> verificarPrimerInicio() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool yaMostrado = prefs.getBool('aviso_mostrado') ?? false;
if (!yaMostrado) {
Future.delayed(Duration.zero, () => mostrarAvisoLegal());
await prefs.setBool('aviso_mostrado', true);
}
}
void mostrarAvisoLegal() {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return AlertDialog(
title: Text("Aviso Legal"),
content: SingleChildScrollView(
child: Text(
"1. Relación con Entidades Oficiales:\n"
"Esta aplicación no está afiliada, respaldada ni oficialmente conectada con ninguna entidad gubernamental, institución o autoridad pública. "
"CR-Civán no representa a ninguna organización oficial ni gubernamental.\n\n"
"2. Datos de los Embalses:\n"
"Los datos sobre el estado de los embalses son proporcionados exclusivamente por la Confederación Hidrográfica del Ebro (CHE), "
"los cuales están a disposición de todo el mundo en (https://www.saihebro.com/homepage/estado-cuenca-ebro). "
"Los datos mostrados en esta aplicación no han sido alterados ni modificados; simplemente se presentan para mayor comodidad del usuario. "
"CR-Civán no representa ni tiene relación directa con la Confederación Hidrográfica del Ebro y, por lo tanto, no se hace responsable de la exactitud o veracidad de los datos proporcionados por la CHE.\n\n"
"3. Información Meteorológica:\n"
"La información meteorológica se proporciona a través de un enlace a la página oficial de la Agencia Estatal de Meteorología (AEMET), "
"disponible en (https://www.aemet.es). CR-Civán no se hace responsable de la exactitud de los datos proporcionados por AEMET, "
"ya que la aplicación solo redirige al usuario a su página oficial sin modificar ni representar la información de manera directa. "
"La información meteorológica se muestra en un navegador externo y no dentro de la propia aplicación, por lo que CR-Civán no se responsabiliza del contenido mostrado en dicho enlace.\n\n"
"4. Responsabilidad sobre los Datos:\n"
"Todos los datos presentados en esta aplicación provienen de fuentes externas y no han sido alterados ni modificados. "
"CR-Civán no asume ninguna responsabilidad sobre la veracidad o exactitud de los mismos.",
style: TextStyle(
fontSize: getResponsiveFontSize(
context, 16)), // Ajustar el tamaño del texto aquí
),
),
actions: [
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor:
Color.fromARGB(255, 255, 255, 255), // Color del botón
),
onPressed: () {
Navigator.of(context).pop();
},
child: Text("LO ENTIENDO"),
),
],
);
},
);
}
double getResponsiveFontSize(BuildContext context, double baseFontSize) {
double screenWidth = MediaQuery.of(context).size.width;
// Ajustar el tamaño del texto en función del ancho de la pantalla
if (screenWidth > 600) {
return baseFontSize * 1.5; // Aumentar el tamaño del texto en tablets
} else {
return baseFontSize; // Mantener el tamaño del texto en teléfonos
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -21,10 +103,13 @@ class MyHomePage extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () { Navigator.push(
context,
MaterialPageRoute(builder: (context) => const NoticiasPage()),
);},
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const NoticiasPage()),
);
},
child: SizedBox(
width: 300.0,
child: Padding(
@ -32,15 +117,15 @@ class MyHomePage extends StatelessWidget {
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 78, 169, 6),
color: const Color.fromARGB(255, 240, 35, 35),
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
'Noticias',
child: Text(
'Avisos',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
@ -62,15 +147,15 @@ class MyHomePage extends StatelessWidget {
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 78, 169, 6),
color: const Color.fromARGB(255, 230, 226, 0),
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
child: Text(
'Pregón',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
@ -82,7 +167,8 @@ class MyHomePage extends StatelessWidget {
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const EmbalsesPage()),
MaterialPageRoute(
builder: (context) => const EmbalsesPage()),
);
},
child: SizedBox(
@ -92,15 +178,46 @@ class MyHomePage extends StatelessWidget {
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 78, 169, 6),
color: const Color.fromARGB(255, 6, 71, 169),
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
child: Text(
'Embalses',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
),
),
),
),
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SeccionesPage()),
);
},
child: SizedBox(
width: 300.0,
child: Padding(
padding: const EdgeInsets.only(bottom: 20.0),
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 97, 97, 97),
borderRadius: BorderRadius.circular(7.0),
),
child: Text(
'Secciones',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
@ -119,15 +236,15 @@ class MyHomePage extends StatelessWidget {
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 78, 169, 6),
color: const Color.fromARGB(255, 255, 255, 255),
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
child: Text(
'Tiempo',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
color: Color.fromARGB(255, 78, 169, 6),
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
@ -135,6 +252,30 @@ class MyHomePage extends StatelessWidget {
),
),
),
SizedBox(height: 20),
InkWell(
onTap: () {
launchPrivacyPolicyURL();
},
child: Text(
'Lee nuestras políticas de privacidad',
style: TextStyle(
color: Colors.blue,
decoration: TextDecoration.underline,
fontSize: getResponsiveFontSize(context, 16.0),
),
),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: mostrarAvisoLegal,
child: Text(
'Aviso Legal',
style: TextStyle(
fontSize: getResponsiveFontSize(context, 16.0),
),
),
),
],
),
),

View File

@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:flutter_project/bars/app_bar';
import 'package:flutter_project/bars/bottom_bar';
import 'package:crcivan/bars/app_bar';
import 'package:crcivan/bars/bottom_bar';
import 'package:html/parser.dart' as htmlParser;
import 'package:flutter_project/widgets/background_widget.dart';
import 'package:crcivan/widgets/background_widget.dart';
import 'package:crcivan/pages/utils.dart';
class NoticiasPage extends StatefulWidget {
const NoticiasPage({Key? key}) : super(key: key);
@ -14,75 +14,59 @@ class NoticiasPage extends StatefulWidget {
}
class _NoticiasPageState extends State<NoticiasPage> {
Map<String, List<Future<String>>> noticiasPorTitulo = {};
List<Map<String, String>> noticias = [];
bool _isLoading = true;
static const String url = 'https://crcivan.asociacionador.es/noticias.html';
@override
void initState() {
super.initState();
obtenerDatos();
obtenerNoticias();
}
Future<void> obtenerDatos() async {
final response = await http.get(Uri.parse('http://www.crcivan.com/escaparate/noticias.cgi?idpadre=92776&idempresa=31637'));
if (response.statusCode == 200) {
var document = htmlParser.parse(response.body);
var tituloElements = document.querySelectorAll('html > body > div > center > table > tbody > tr > td > div > center > table > tbody > tr > td > table > tbody > tr > td > b > a');
Future<void> obtenerNoticias() async {
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
var document = htmlParser.parse(response.body);
var noticiasElements = document.querySelectorAll(
'html > body > div > center > table > tbody > tr > td > div > center > table > tbody > tr > td > table > tbody > tr > td'
);
for (int i = 0; i < tituloElements.length; i++) {
String titulo = tituloElements[i].text.trim();
var noticiasTemp = <Map<String, String>>[];
// Extrayendo el enlace href del elemento <a>
var linkElement = tituloElements[i];
String? link = linkElement.attributes['href'];
for (var element in noticiasElements) {
var tituloElement = element.querySelector('b > a');
if (tituloElement != null) {
var titulo = tituloElement.text.trim();
var href = tituloElement.attributes['href'];
if (link != null) {
noticiasPorTitulo[titulo] = [cargarContenidoUrl(link)];
}
}
await Future.wait(noticiasPorTitulo.values.expand((element) => element).toList());
setState(() {});
} else {
throw Exception('Fallo al cargar noticias');
}
}
Future<String> cargarContenidoUrl(String url) async {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
var document = htmlParser.parse(response.body);
var paragraphAndLists = document.querySelectorAll('html > body > div > center > table > tbody > tr > td > div > center > table > tbody > tr > td > table > tbody > tr > td > font > font > p, html > body > div > center > table > tbody > tr > td > div > center > table > tbody > tr > td > table > tbody > tr > td > font > font > ul');
String content = '';
String currentParagraphContent = '';
for (var element in paragraphAndLists) {
if (element.localName == 'p') {
if (currentParagraphContent.isNotEmpty) {
content += currentParagraphContent + '\n';
currentParagraphContent = '';
}
currentParagraphContent += element.text.trim() + '\n';
} else if (element.localName == 'ul') {
if (currentParagraphContent.isNotEmpty) {
content += currentParagraphContent + '\n';
currentParagraphContent = '';
}
var listItems = element.querySelectorAll('li');
for (var listItem in listItems) {
content += '- ${listItem.text.trim()}\n';
var contenido = '';
var fontElements = element.querySelectorAll('font');
for (var font in fontElements) {
contenido += '${font.text.trim()}\n';
}
noticiasTemp.add({
'titulo': titulo,
'contenido': contenido.trim(),
'href': href ?? ''
});
}
}
}
if (currentParagraphContent.isNotEmpty) {
content += currentParagraphContent + '\n';
setState(() {
noticias = noticiasTemp;
_isLoading = false;
});
} else {
throw Exception('Fallo al cargar noticias');
}
return content;
} else {
throw Exception('Fallo al cargar contenido de URL: $url');
} catch (e) {
print('Error al obtener noticias: $e');
setState(() {
_isLoading = false;
});
}
}
@ -90,45 +74,40 @@ class _NoticiasPageState extends State<NoticiasPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: const CustomAppBar(),
body: BackgroundWidget(
body: _isLoading
? Center(child: CircularProgressIndicator())
: BackgroundWidget(
child: ListView.builder(
itemCount: noticiasPorTitulo.length,
itemCount: noticias.length,
itemBuilder: (context, index) {
String titulo = noticiasPorTitulo.keys.elementAt(index);
List<Future<String>>? noticias = noticiasPorTitulo[titulo];
var titulo = noticias[index]['titulo'];
var contenido = noticias[index]['contenido'];
var href = noticias[index]['href'];
return FutureBuilder<List<String>>(
future: Future.wait(noticias ?? []),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (!snapshot.hasData) {
return Text('No hay datos');
} else {
return Container(
color: Colors.white.withOpacity(0.5), // Fondo blanco con 50% de opacidad
margin: const EdgeInsets.all(8.0),
return Container(
color: Colors.white.withOpacity(0.5), // Fondo blanco con 50% de opacidad
margin: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0),
child: ExpansionTile(
title: Text(
titulo!,
style: TextStyle(
fontWeight: FontWeight.bold, // Establecer negrita para el título
fontSize: getResponsiveFontSize(context, 18.0),
),
),
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: ExpansionTile(
title: Text(
titulo,
style: TextStyle(fontWeight: FontWeight.bold),
child: Text(
contenido!,
style: TextStyle(
fontSize: getResponsiveFontSize(context, 16.0), // Mantener el texto del contenido en estilo regular
),
children: snapshot.data!.map((noticia) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
noticia,
style: TextStyle(fontSize: 16.0),
),
);
}).toList(),
),
);
}
},
),
],
),
);
},
),

View File

@ -2,11 +2,10 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as htmlParser;
import 'package:html/dom.dart' as htmlDom;
import 'package:flutter_project/bars/app_bar';
import 'package:flutter_project/bars/bottom_bar';
import 'package:flutter_project/widgets/background_widget.dart';
import 'package:crcivan/bars/app_bar';
import 'package:crcivan/bars/bottom_bar';
import 'package:crcivan/widgets/background_widget.dart';
import 'package:crcivan/pages/utils.dart';
class Pregon extends StatefulWidget {
const Pregon({Key? key}) : super(key: key);
@ -25,7 +24,7 @@ class _PregonState extends State<Pregon> {
}
Future<void> obtenerDatos() async {
final response = await http.get(Uri.parse('http://www.crcivan.com/escaparate/noticias.cgi?idnoticias=192680'));
final response = await http.get(Uri.parse('https://crcivan.asociacionador.es/pregon.html'));
if (response.statusCode == 200) {
final document = htmlParser.parse(response.body);
@ -83,7 +82,8 @@ class _PregonState extends State<Pregon> {
datos[index],
textAlign: TextAlign.center,
style: TextStyle(
color: hasMes ? Color.fromARGB(255, 0, 0, 0) : Color.fromARGB(255, 0, 0, 0), fontWeight : FontWeight.bold, fontSize : 22.0
color: hasMes ? Color.fromARGB(255, 0, 0, 0) : Color.fromARGB(255, 0, 0, 0),
fontSize: getResponsiveFontSize(context, 22.0),
),
),
),

133
lib/pages/secciones Normal file
View File

@ -0,0 +1,133 @@
import 'package:flutter/material.dart';
import 'package:crcivan/BloC/DataService.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as htmlParser;
import 'package:html/dom.dart' as htmlDom;
import 'package:crcivan/bars/app_bar';
import 'package:crcivan/bars/bottom_bar';
import 'package:crcivan/widgets/background_widget.dart';
import 'package:crcivan/pages/utils.dart';
class SeccionesPage extends StatefulWidget {
const SeccionesPage({Key? key}) : super(key: key);
@override
_SeccionesPageState createState() => _SeccionesPageState();
}
class _SeccionesPageState extends State<SeccionesPage> {
final DataService dataService = DataService();
String communicationDate = '';
List<Map<String, dynamic>> seccionesData = [];
@override
void initState() {
super.initState();
obtenerDatosSecciones();
}
Future<void> obtenerDatosSecciones() async {
try {
final data = await dataService.obtenerDatosSecciones();
setState(() {
communicationDate = data['communicationDate'];
seccionesData = data['seccionesData'];
});
} catch (e) {
print('Error: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const CustomAppBar(),
body: BackgroundWidget(
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
communicationDate,
style: TextStyle(
fontSize: getResponsiveFontSize(context, 18.0),
fontWeight: FontWeight.bold,
),
),
),
Expanded(
child: ListView.builder(
itemCount: seccionesData.length,
itemBuilder: (context, index) {
final seccion = seccionesData[index];
return Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.5),
borderRadius: BorderRadius.circular(10.0),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const Text(
'ÚLTIMO RIEGO',
style: TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.bold,
),
),
const SizedBox(width: 8.0),
Text(
seccion['section'],
style: TextStyle(
fontSize: getResponsiveFontSize(context, 20.0),
fontWeight: FontWeight.bold,
),
),
],
),
),
if (seccion['guardInfo'] != null)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Text(
seccion['guardInfo'],
style: TextStyle(
fontSize: getResponsiveFontSize(context, 20.0),
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic,
),
),
),
...seccion['data'].map<Widget>((data) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
child: Text(
'${data['date']}: ${data['location']}',
style: TextStyle(
fontSize: getResponsiveFontSize(context, 16.0),
),
),
);
}).toList(),
],
),
),
);
},
),
),
],
),
),
bottomNavigationBar: const CustomBottomBar(),
);
}
}

11
lib/pages/utils.dart Normal file
View File

@ -0,0 +1,11 @@
import 'package:flutter/material.dart';
double getResponsiveFontSize(BuildContext context, double baseFontSize) {
double screenWidth = MediaQuery.of(context).size.width;
// Ajustar el tamaño del texto en función del ancho de la pantalla
if (screenWidth > 600) {
return baseFontSize * 1.6; // Aumentar el tamaño del texto en tablets
} else {
return baseFontSize; // Mantener el tamaño del texto en teléfonos
}
}

View File

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
class BackgroundWidget extends StatelessWidget {
final Widget child;
const BackgroundWidget({required this.child, Key? key}) : super(key: key);
const BackgroundWidget({required this.child, super.key});
@override
Widget build(BuildContext context) {

View File

@ -7,7 +7,7 @@ project(runner LANGUAGES CXX)
set(BINARY_NAME "flutter_project")
# The unique GTK application identifier for this application. See:
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
set(APPLICATION_ID "com.example.flutter_project")
set(APPLICATION_ID "com.asociacionador.civan")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.

View File

@ -5,8 +5,10 @@
import FlutterMacOS
import Foundation
import shared_preferences_foundation
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
}

View File

@ -1,14 +1,22 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
args:
dependency: transitive
description:
name: args
sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
url: "https://pub.dev"
source: hosted
version: "2.5.0"
version: "2.6.0"
async:
dependency: transitive
description:
@ -33,6 +41,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.1"
change_app_package_name:
dependency: "direct main"
description:
name: change_app_package_name
sha256: "1d6ca5fbaba7264f70857941543337b2efe48f19ae2eef29b89927541b52a787"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
characters:
dependency: transitive
description:
@ -41,6 +57,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.0"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
url: "https://pub.dev"
source: hosted
version: "2.0.3"
cli_util:
dependency: transitive
description:
name: cli_util
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
url: "https://pub.dev"
source: hosted
version: "0.4.2"
clock:
dependency: transitive
description:
@ -53,18 +85,26 @@ packages:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.0"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
csslib:
dependency: transitive
description:
name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.0.2"
cupertino_icons:
dependency: "direct main"
description:
@ -81,6 +121,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
@ -90,10 +146,18 @@ packages:
dependency: "direct main"
description:
name: flutter_bloc
sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
url: "https://pub.dev"
source: hosted
version: "8.1.5"
version: "8.1.6"
flutter_launcher_icons:
dependency: "direct main"
description:
name: flutter_launcher_icons
sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c
url: "https://pub.dev"
source: hosted
version: "0.14.3"
flutter_lints:
dependency: "direct dev"
description:
@ -106,10 +170,10 @@ packages:
dependency: "direct main"
description:
name: flutter_svg
sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
url: "https://pub.dev"
source: hosted
version: "2.0.10+1"
version: "2.0.17"
flutter_test:
dependency: "direct dev"
description: flutter
@ -132,42 +196,58 @@ packages:
dependency: "direct dev"
description:
name: http
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.3.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
version: "4.1.2"
image:
dependency: transitive
description:
name: image
sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6"
url: "https://pub.dev"
source: hosted
version: "4.5.2"
json_annotation:
dependency: transitive
description:
name: json_annotation
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
url: "https://pub.dev"
source: hosted
version: "4.9.0"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev"
source: hosted
version: "10.0.0"
version: "10.0.7"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "3.0.8"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "3.0.1"
lints:
dependency: transitive
description:
@ -188,18 +268,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.8.0"
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.11.0"
version: "1.15.0"
nested:
dependency: transitive
description:
@ -220,10 +300,34 @@ packages:
dependency: transitive
description:
name: path_parsing
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
version: "1.1.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
petitparser:
dependency: transitive
description:
@ -232,6 +336,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.0.2"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
@ -240,6 +352,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
posix:
dependency: transitive
description:
name: posix
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
url: "https://pub.dev"
source: hosted
version: "6.0.1"
provider:
dependency: transitive
description:
@ -248,11 +368,67 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.1.2"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
url: "https://pub.dev"
source: hosted
version: "2.5.2"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22
url: "https://pub.dev"
source: hosted
version: "2.4.6"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
url: "https://pub.dev"
source: hosted
version: "2.5.4"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev"
source: hosted
version: "2.4.3"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
source_span:
dependency: transitive
description:
@ -265,10 +441,10 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.0"
stream_channel:
dependency: transitive
description:
@ -281,10 +457,10 @@ packages:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.3.0"
term_glyph:
dependency: transitive
description:
@ -297,58 +473,58 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev"
source: hosted
version: "0.6.1"
version: "0.7.3"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.3.2"
version: "1.4.0"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
version: "6.2.6"
version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.1"
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5"
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
url: "https://pub.dev"
source: hosted
version: "6.2.5"
version: "6.3.2"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.2.2"
url_launcher_platform_interface:
dependency: transitive
description:
@ -361,42 +537,42 @@ packages:
dependency: transitive
description:
name: url_launcher_web
sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
version: "2.4.0"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "3.1.4"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
sha256: "7ed22c21d7fdcc88dd6ba7860384af438cd220b251ad65dfc142ab722fabef61"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.16"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.13"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
version: "1.1.16"
vector_math:
dependency: transitive
description:
@ -409,18 +585,26 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev"
source: hosted
version: "13.0.0"
version: "14.3.0"
web:
dependency: transitive
description:
name: web
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "0.5.1"
version: "1.1.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xml:
dependency: transitive
description:
@ -429,6 +613,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.5.0"
yaml:
dependency: transitive
description:
name: yaml
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.dev"
source: hosted
version: "3.1.3"
sdks:
dart: ">=3.3.4 <4.0.0"
flutter: ">=3.19.0"
dart: ">=3.6.0 <4.0.0"
flutter: ">=3.27.0"

View File

@ -1,5 +1,5 @@
name: flutter_project
description: "A new Flutter project."
name: crcivan
description: "App para los regantes de CR Civán"
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
@ -33,6 +33,7 @@ dependencies:
url_launcher: ^6.0.12
flutter_bloc: ^8.1.5
flutter_svg: ^2.0.10+1
shared_preferences: ^2.2.0
@ -41,6 +42,8 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.6
flutter_launcher_icons: ^0.14.1
change_app_package_name: ^1.4.0
dev_dependencies:
flutter_test:
@ -54,10 +57,15 @@ dev_dependencies:
flutter_lints: ^3.0.0
http: ^1.2.1
html: 0.15.4
flutter_launcher_icons:
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
flutter_icons:
android: true
ios: true
image_path: "assets/icon/app_icon.png"
adaptive_icon_background: "#FFFFFF" # Color de fondo del ícono adaptativo (o puedes usar un archivo de imagen)
adaptive_icon_foreground: "assets/icon/app_icon.png" # Ruta al ícono para el ícono redondo (si es el mismo que el normal, repite la ruta aquí)
# The following section is specific to Flutter packages.
flutter:
@ -74,6 +82,7 @@ flutter:
- assets/logo-sin-texto.png
- assets/logo-sin-texto.svg
- assets/logo-fondo-verde.png
- assets/icon/app_icon.png
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see

View File

@ -8,7 +8,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_project/main/main.dart';
import 'package:crcivan/main/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {