Compare commits

24 Commits

Author SHA1 Message Date
6c062682f6 Ultima version para Google Play, cambios en politicas y colores. Nuevo aviso legal 2025-03-12 09:54:39 +01:00
0d61ca6d01 "Añadidas politicas de privacidad en la pantalla principal" 2025-02-14 12:35:18 +01:00
2cf910e5a1 cambios para la nueva version de Google y actualizaciones de flutter 2025-01-31 14:31:42 +01:00
9e221e70fa Añadido engitignore el key.properties y cambios en build.gradle para publicacion 2024-10-25 13:05:46 +02:00
434b31eab2 clave keystore 2024-10-24 13:00:39 +02:00
3f66531ab3 cambios en nombre de app para publicacion 2024-10-24 12:52:09 +02:00
46309589e4 correccion errores y nuevo namespace e id para publicacion 2024-10-22 17:04:30 +02:00
03c550cba5 "Corregido error con el icono redondo " 2024-10-22 12:04:50 +02:00
a7a97bfeae "cambios en iconos de la app android" 2024-10-09 16:41:16 +02:00
be701d6e50 aplicacion terminada, fondo verde 2024-06-03 15:45:35 +02:00
20a4cb7ab2 aplicacion terminada, clase widget creada y separacion bloc 2024-05-21 16:52:01 +02:00
df5651feac prueba 2024-05-21 09:50:19 +02:00
560a262521 Aplicacion terminada v2 2024-05-20 14:05:58 +02:00
5f4dc6fc01 todas las clases funcionales 2024-05-16 16:13:59 +02:00
0c1ef39a32 Cambio interfaz home (prueba), error en enlace Tiempo y noticias faltan mejoras 2024-05-16 12:28:25 +02:00
eec626ac3a embalses listos y notificaciones con titulo. Faltan mejoras 2024-05-13 16:53:53 +02:00
4dfb710eba embalses visibles, lógica adecuada, necesidad de cambios en interfaz 2024-05-13 11:05:49 +02:00
66b4708d63 noticias creada, embalses necesita tabla y pregones separados por dividers 2024-05-09 17:02:25 +02:00
7c2577259e Agregada interfaz de pregon, diseño y patron bloc 2024-05-02 17:23:26 +02:00
5014ad6bd3 Separacion de codigo por carpetas, cambio de estilo, clase pregon integrada 2024-04-30 16:55:25 +02:00
325e6d4f63 Cambio de imagen y funcion launchAemet integrada 2024-04-29 16:45:40 +02:00
13050116ac ficheros app_bar y bottom_bar creados 2024-04-29 13:00:21 +02:00
dd5be31611 Patron bloc integrado 2024-04-29 11:17:27 +02:00
4f7bb569d8 agregado patron bloc y barra de contacto 2024-04-25 15:41:24 +02:00
81 changed files with 1790 additions and 368 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

9
.vscode/launch.json vendored
View File

@ -7,19 +7,22 @@
{
"name": "flutter_project",
"request": "launch",
"type": "dart"
"type": "dart",
"program": "lib/main/main.dart"
},
{
"name": "flutter_project (profile mode)",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
"flutterMode": "profile",
"program": "lib/main.dart"
},
{
"name": "flutter_project (release mode)",
"request": "launch",
"type": "dart",
"flutterMode": "release"
"flutterMode": "release",
"program": "lib/main.dart"
}
]
}

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,8 +1,11 @@
<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"
android:exported="true"
@ -11,34 +14,32 @@
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- Especifica un tema de Android para aplicar a esta actividad tan pronto como se haya iniciado el proceso de Android. Este tema es visible para el usuario mientras la interfaz de usuario de Flutter se inicializa. Después de eso, este tema continúa determinando el fondo de la ventana detrás de la interfaz de usuario de Flutter. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<!-- No elimines los metadatos a continuación. Esto es utilizado por la herramienta Flutter para generar GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility?hl=en and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
</application>
<!-- Requerido para consultar actividades que pueden procesar texto, ver: https://developer.android.com/training/package-visibility?hl=en y https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. En particular, esto es utilizado por el motor Flutter en io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
<!-- Permiso de Internet -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

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

@ -4,4 +4,5 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

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

BIN
assets/logo-fondo-verde.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
assets/logo-fondo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
assets/logo-sin-texto.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
assets/logo-sin-texto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

53
assets/logo-sin-texto.svg Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="66.698677mm"
height="66.133186mm"
viewBox="0 0 66.698677 66.133186"
version="1.1"
id="svg5"
xml:space="preserve"
sodipodi:docname="logo-asoc-grande.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
showguides="true"
inkscape:zoom="1.8019391"
inkscape:cx="402.8993"
inkscape:cy="349.0684"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg5"><inkscape:grid
type="xygrid"
id="grid238" /><sodipodi:guide
position="74.64686,85.210352"
orientation="0,-1"
id="guide1143"
inkscape:locked="false" /><sodipodi:guide
position="65.946521,97.814762"
orientation="0,-1"
id="guide398"
inkscape:locked="false" /></sodipodi:namedview><defs
id="defs2" /><path
style="fill:#0082bf;fill-opacity:1;stroke-width:0.565242"
d="M 3.8256413,64.96974 C 1.6212279,63.805813 0,61.404811 0,59.304008 0,57.377233 2.0882044,54.474124 4.1923461,53.475657 7.4248337,51.941735 11.533958,52.382721 17.387206,54.891716 l 2.605907,1.117034 -5.038897,5.062341 C 10.481792,65.56433 9.6915923,66.130634 7.9251864,66.108458 6.8306119,66.09564 4.9858169,65.582296 3.8256413,64.96974 Z M 24.682904,60.904947 c 5.716857,-5.793101 7.153276,-8.091559 7.153276,-11.446165 0,-5.656058 -6.928963,-12.757525 -13.299602,-13.630716 -6.213556,-0.851657 -10.6927139,3.613467 -7.053978,7.031886 1.896828,1.781973 3.325517,1.522834 5.689296,-1.031965 1.451897,-1.569214 2.560539,-2.260324 3.623566,-2.25885 3.67423,0.0043 7.486062,4.374543 6.666143,7.64137 -0.213293,0.849798 -1.619931,2.836733 -3.125873,4.415412 l -2.738076,2.870294 -6.700816,-2.74081 C 9.6810515,49.622 7.2878274,48.953364 4.0980112,48.738405 L 0,48.462238 V 33.734441 19.00667 l 5.5657444,5.468226 c 5.6299076,5.53127 8.2441516,7.178718 11.3915446,7.178718 3.981394,0 9.031607,-3.700973 11.918786,-8.734494 2.171855,-3.786448 2.348489,-9.083916 0.375248,-11.254428 -1.837809,-2.0215436 -3.367843,-2.2876689 -5.139682,-0.893935 -2.254293,1.773215 -2.005014,3.853722 0.75905,6.335073 2.445386,2.195272 2.74866,3.486461 1.421638,6.052646 -1.18574,2.292968 -3.784741,3.973187 -6.145794,3.973187 -1.640304,0 -2.584473,-0.541031 -5.178599,-2.967521 l -3.172548,-2.96752 1.732427,-3.80153 C 16.220333,11.48682 18.087776,5.421718 18.087776,2.5852415 V 0 h 14.517832 14.517811 l -5.113015,5.2285064 c -5.899962,6.0332056 -6.965339,7.8059716 -6.965339,11.5900486 0,6.262393 8.05099,13.687774 14.855782,13.701425 5.221114,0.01068 8.410879,-4.338267 5.315221,-7.246482 -1.896824,-1.781974 -3.325509,-1.522834 -5.689296,1.031964 -1.451886,1.569214 -2.560524,2.260324 -3.623573,2.25885 -3.674225,-0.0043 -7.486053,-4.374543 -6.666143,-7.641366 0.213208,-0.849798 1.619932,-2.836733 3.125888,-4.415411 l 2.738076,-2.870295 6.700816,2.740811 c 5.215774,2.133403 7.609022,2.802017 10.798829,3.016998 l 4.098014,0.276166 V 32.399008 47.126784 L 61.132928,41.658553 C 55.46162,36.086607 52.892657,34.479836 49.65538,34.479836 c -4.223161,0 -10.132651,4.748874 -12.461829,10.014382 -1.462696,3.30667 -1.236264,8.694463 0.43276,10.297261 2.02304,1.942733 3.480694,1.975526 5.336243,0.120063 0.930403,-0.930403 1.691649,-1.99108 1.691649,-2.357058 0,-0.365979 -1.144615,-1.826431 -2.543604,-3.245439 -2.789029,-2.828999 -2.911249,-3.245891 -1.75967,-6.001998 1.447079,-3.463346 5.749413,-5.405011 8.566576,-3.866112 0.608562,0.332438 2.194332,1.721579 3.523891,3.087006 l 2.41741,2.482569 -1.484957,3.354653 c -3.287289,7.426278 -4.309277,10.735935 -4.394411,14.231134 l -0.08588,3.528291 -14.685151,0.0043 -14.685147,0.0043 5.159692,-5.228485 z m 31.707195,4.343673 c -3.885232,-2.108088 -4.4682,-8.485545 -1.430458,-15.648539 0.62625,-1.476689 1.31563,-2.684903 1.531978,-2.684903 0.216348,0 2.601435,2.256479 5.300202,5.014402 3.418098,3.49302 4.903098,5.422358 4.894445,6.358978 -0.01923,2.002487 -1.943054,5.871056 -3.443649,6.92212 -1.625677,1.138675 -4.791579,1.156193 -6.852518,0.03803 z M 5.1864032,14.484847 C -0.47485751,8.7119555 -0.7105868,8.1197376 1.081733,4.1729138 2.4319861,1.1995399 4.1710573,0 7.1315298,0 c 4.5858772,0 7.4027162,4.5216518 6.4489542,10.35199 -0.385673,2.357634 -2.481993,8.694651 -3.071597,9.285202 -0.07484,0.07499 -2.4699612,-2.243596 -5.3224838,-5.152345 z M 51.940144,12.223049 C 49.885187,11.49763 47.887058,10.708333 47.499865,10.46904 47.014273,10.168904 48.344899,8.477726 51.789616,5.0169862 56.066357,0.72035633 57.052048,0 58.654696,0 c 4.006343,0 8.043983,3.4280108 8.043983,6.8294454 0,1.9660628 -2.268549,5.1015216 -4.307355,5.9533916 -2.709641,1.13216 -6.185698,0.945977 -10.45118,-0.559788 z"
id="path287-5-2"
inkscape:export-filename="logo-sin-texto.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" /></svg>

After

Width:  |  Height:  |  Size: 5.4 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

103
lib/BloC/DataService.dart Normal file
View File

@ -0,0 +1,103 @@
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as htmlParser;
class DataService {
Future<List<Map<String, dynamic>>> obtenerDatos() 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 filaTabla = 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');
List<Map<String, dynamic>> embalsesData = [];
for (var fila in filaTabla) {
var nombreElemento = fila.querySelector('td > p > span');
var elementos = fila.querySelectorAll('td > span');
if (nombreElemento != null && elementos.isNotEmpty) {
var nombre = nombreElemento.text;
var listaElementos = elementos.map<String>((elemento) => elemento.text).toList();
var embalseMap = {'nombre': nombre, 'elementos': listaElementos};
embalsesData.add(embalseMap);
}
}
return embalsesData;
} else {
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

@ -0,0 +1,62 @@
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;
// Define el estado
class MyState {
}
// Define el bloc
class MyBloc extends Cubit<MyState> {
MyBloc() : super(MyState());
}
Future<List<String>> obtenerDatos() 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 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');
List<String> embalsesData = [];
for (var elemento in elementosSpan) {
final style = elemento.attributes['style'];
if (style != null && style.contains('color: #000000; font-size: 12pt;')) {
embalsesData.add(elemento.text);
}
}
return embalsesData;
} else {
throw Exception('Error al cargar los datos de embalses');
}
}
Future<void> launchAemetURL() async {
const urlString = 'https://www.aemet.es/es/eltiempo/prediccion/municipios/caspe-id50074';
final url = Uri.parse(urlString);
try {
await launch(urlString);
/* if (await canLaunch(urlString)) {
await launch(urlString);
} else {
throw 'Could not launch $urlString';
}*/
} catch (e) {
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');
}
}

0
lib/BloC/estados Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
lib/assets/logo-fondo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="66.698677mm"
height="66.133186mm"
viewBox="0 0 66.698677 66.133186"
version="1.1"
id="svg5"
xml:space="preserve"
sodipodi:docname="logo-asoc-grande.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="true"
showguides="true"
inkscape:zoom="1.8019391"
inkscape:cx="402.8993"
inkscape:cy="349.0684"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg5"><inkscape:grid
type="xygrid"
id="grid238" /><sodipodi:guide
position="74.64686,85.210352"
orientation="0,-1"
id="guide1143"
inkscape:locked="false" /><sodipodi:guide
position="65.946521,97.814762"
orientation="0,-1"
id="guide398"
inkscape:locked="false" /></sodipodi:namedview><defs
id="defs2" /><path
style="fill:#0082bf;fill-opacity:1;stroke-width:0.565242"
d="M 3.8256413,64.96974 C 1.6212279,63.805813 0,61.404811 0,59.304008 0,57.377233 2.0882044,54.474124 4.1923461,53.475657 7.4248337,51.941735 11.533958,52.382721 17.387206,54.891716 l 2.605907,1.117034 -5.038897,5.062341 C 10.481792,65.56433 9.6915923,66.130634 7.9251864,66.108458 6.8306119,66.09564 4.9858169,65.582296 3.8256413,64.96974 Z M 24.682904,60.904947 c 5.716857,-5.793101 7.153276,-8.091559 7.153276,-11.446165 0,-5.656058 -6.928963,-12.757525 -13.299602,-13.630716 -6.213556,-0.851657 -10.6927139,3.613467 -7.053978,7.031886 1.896828,1.781973 3.325517,1.522834 5.689296,-1.031965 1.451897,-1.569214 2.560539,-2.260324 3.623566,-2.25885 3.67423,0.0043 7.486062,4.374543 6.666143,7.64137 -0.213293,0.849798 -1.619931,2.836733 -3.125873,4.415412 l -2.738076,2.870294 -6.700816,-2.74081 C 9.6810515,49.622 7.2878274,48.953364 4.0980112,48.738405 L 0,48.462238 V 33.734441 19.00667 l 5.5657444,5.468226 c 5.6299076,5.53127 8.2441516,7.178718 11.3915446,7.178718 3.981394,0 9.031607,-3.700973 11.918786,-8.734494 2.171855,-3.786448 2.348489,-9.083916 0.375248,-11.254428 -1.837809,-2.0215436 -3.367843,-2.2876689 -5.139682,-0.893935 -2.254293,1.773215 -2.005014,3.853722 0.75905,6.335073 2.445386,2.195272 2.74866,3.486461 1.421638,6.052646 -1.18574,2.292968 -3.784741,3.973187 -6.145794,3.973187 -1.640304,0 -2.584473,-0.541031 -5.178599,-2.967521 l -3.172548,-2.96752 1.732427,-3.80153 C 16.220333,11.48682 18.087776,5.421718 18.087776,2.5852415 V 0 h 14.517832 14.517811 l -5.113015,5.2285064 c -5.899962,6.0332056 -6.965339,7.8059716 -6.965339,11.5900486 0,6.262393 8.05099,13.687774 14.855782,13.701425 5.221114,0.01068 8.410879,-4.338267 5.315221,-7.246482 -1.896824,-1.781974 -3.325509,-1.522834 -5.689296,1.031964 -1.451886,1.569214 -2.560524,2.260324 -3.623573,2.25885 -3.674225,-0.0043 -7.486053,-4.374543 -6.666143,-7.641366 0.213208,-0.849798 1.619932,-2.836733 3.125888,-4.415411 l 2.738076,-2.870295 6.700816,2.740811 c 5.215774,2.133403 7.609022,2.802017 10.798829,3.016998 l 4.098014,0.276166 V 32.399008 47.126784 L 61.132928,41.658553 C 55.46162,36.086607 52.892657,34.479836 49.65538,34.479836 c -4.223161,0 -10.132651,4.748874 -12.461829,10.014382 -1.462696,3.30667 -1.236264,8.694463 0.43276,10.297261 2.02304,1.942733 3.480694,1.975526 5.336243,0.120063 0.930403,-0.930403 1.691649,-1.99108 1.691649,-2.357058 0,-0.365979 -1.144615,-1.826431 -2.543604,-3.245439 -2.789029,-2.828999 -2.911249,-3.245891 -1.75967,-6.001998 1.447079,-3.463346 5.749413,-5.405011 8.566576,-3.866112 0.608562,0.332438 2.194332,1.721579 3.523891,3.087006 l 2.41741,2.482569 -1.484957,3.354653 c -3.287289,7.426278 -4.309277,10.735935 -4.394411,14.231134 l -0.08588,3.528291 -14.685151,0.0043 -14.685147,0.0043 5.159692,-5.228485 z m 31.707195,4.343673 c -3.885232,-2.108088 -4.4682,-8.485545 -1.430458,-15.648539 0.62625,-1.476689 1.31563,-2.684903 1.531978,-2.684903 0.216348,0 2.601435,2.256479 5.300202,5.014402 3.418098,3.49302 4.903098,5.422358 4.894445,6.358978 -0.01923,2.002487 -1.943054,5.871056 -3.443649,6.92212 -1.625677,1.138675 -4.791579,1.156193 -6.852518,0.03803 z M 5.1864032,14.484847 C -0.47485751,8.7119555 -0.7105868,8.1197376 1.081733,4.1729138 2.4319861,1.1995399 4.1710573,0 7.1315298,0 c 4.5858772,0 7.4027162,4.5216518 6.4489542,10.35199 -0.385673,2.357634 -2.481993,8.694651 -3.071597,9.285202 -0.07484,0.07499 -2.4699612,-2.243596 -5.3224838,-5.152345 z M 51.940144,12.223049 C 49.885187,11.49763 47.887058,10.708333 47.499865,10.46904 47.014273,10.168904 48.344899,8.477726 51.789616,5.0169862 56.066357,0.72035633 57.052048,0 58.654696,0 c 4.006343,0 8.043983,3.4280108 8.043983,6.8294454 0,1.9660628 -2.268549,5.1015216 -4.307355,5.9533916 -2.709641,1.13216 -6.185698,0.945977 -10.45118,-0.559788 z"
id="path287-5-2"
inkscape:export-filename="logo-sin-texto.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96" /></svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

42
lib/bars/app_bar Normal file
View File

@ -0,0 +1,42 @@
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: 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(
child: Padding(
padding: const EdgeInsets.only(top: 10.0),
child: Image.asset(
'assets/logo-civan.png',
height: getResponsiveFontSize(context, 200.0), // Ajustar la altura de la imagen
width: getResponsiveFontSize(context, 200.0), // Ajustar el ancho de la imagen
),
),
),
),
);
}
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight); // Tamaño fijo para el AppBar
}

57
lib/bars/bottom_bar Normal file
View File

@ -0,0 +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');
}
}
@override
Widget build(BuildContext context) {
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');
},
),
],
),
),
);
}
}

View File

@ -1,186 +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(const MyApp());
runApp(
BlocProvider(
create: (context) => MyBloc(),
child: const MyApp(),
),
);
}
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'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(''),
centerTitle: true,
backgroundColor: const Color.fromARGB(255, 33, 150, 243),
leading: IconButton(
onPressed: () {},
icon: const Icon(Icons.menu),
color: Colors.white,
),
flexibleSpace: Container(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Image.asset(
'assets/logo-civan.png',
height: 200, // Cambia la altura según sea necesario
width: 200, // Cambia el ancho según sea necesario
),
),
),
),
body: Container(
decoration: BoxDecoration(
image: DecorationImage(
image:
AssetImage('assets/agua.jpg'), // Ruta de la imagen de fondo
fit: BoxFit
.cover, // Ajusta la imagen para que cubra todo el contenedor
),
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {
print('Contenedor noticias clickeado');
},
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: Colors.blue,
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
'Noticias',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
InkWell(
onTap: () {
print('Contenedor pregón clickeado');
},
customBorder: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(100)),
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: Colors.blue,
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
'Pregón del día',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
InkWell(
onTap: () {
print('Contenedor embalses clickeado');
},
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.fromRGBO(33, 150, 243, 1),
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
'Embalses',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
InkWell(
onTap: () {
print('Contenedor tiempo clickeado');
},
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.fromRGBO(33, 150, 243, 1),
borderRadius: BorderRadius.circular(7.0),
),
child: const Text(
'Tiempo',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 32.0,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
],
),
),
));
}
}

30
lib/main/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'),
);
}
}

139
lib/pages/embalses Normal file
View File

@ -0,0 +1,139 @@
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 EmbalsesPage extends StatefulWidget {
const EmbalsesPage({Key? key}) : super(key: key);
@override
_EmbalsesPageState createState() => _EmbalsesPageState();
}
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)'];
@override
void initState() {
super.initState();
obtenerDatos();
obtenerFechaComunicacion();
}
Future<void> obtenerDatos() async {
try {
final data = await dataService.obtenerDatos();
setState(() {
embalsesData = data;
});
} catch (e) {
print('Error: $e');
}
}
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: 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: 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(),
);
}
}

286
lib/pages/my_home_page.dart Normal file
View File

@ -0,0 +1,286 @@
import 'package:crcivan/BloC/contenedores_event.dart';
import 'package:flutter/material.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 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(
appBar: const CustomAppBar(),
body: BackgroundWidget(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const NoticiasPage()),
);
},
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, 240, 35, 35),
borderRadius: BorderRadius.circular(7.0),
),
child: Text(
'Avisos',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
),
),
),
),
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const Pregon()),
);
},
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, 230, 226, 0),
borderRadius: BorderRadius.circular(7.0),
),
child: Text(
'Pregón',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
),
),
),
),
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const EmbalsesPage()),
);
},
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, 6, 71, 169),
borderRadius: BorderRadius.circular(7.0),
),
child: Text(
'Embalses',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
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,
),
),
),
),
),
),
InkWell(
onTap: () {
launchAemetURL();
},
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, 255, 255, 255),
borderRadius: BorderRadius.circular(7.0),
),
child: Text(
'Tiempo',
textAlign: TextAlign.center,
style: TextStyle(
color: Color.fromARGB(255, 78, 169, 6),
fontSize: getResponsiveFontSize(context, 32.0),
fontWeight: FontWeight.bold,
),
),
),
),
),
),
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),
),
),
),
],
),
),
),
bottomNavigationBar: const CustomBottomBar(),
);
}
}

118
lib/pages/noticias Normal file
View File

@ -0,0 +1,118 @@
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:crcivan/bars/app_bar';
import 'package:crcivan/bars/bottom_bar';
import 'package:html/parser.dart' as htmlParser;
import 'package:crcivan/widgets/background_widget.dart';
import 'package:crcivan/pages/utils.dart';
class NoticiasPage extends StatefulWidget {
const NoticiasPage({Key? key}) : super(key: key);
@override
_NoticiasPageState createState() => _NoticiasPageState();
}
class _NoticiasPageState extends State<NoticiasPage> {
List<Map<String, String>> noticias = [];
bool _isLoading = true;
static const String url = 'https://crcivan.asociacionador.es/noticias.html';
@override
void initState() {
super.initState();
obtenerNoticias();
}
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'
);
var noticiasTemp = <Map<String, String>>[];
for (var element in noticiasElements) {
var tituloElement = element.querySelector('b > a');
if (tituloElement != null) {
var titulo = tituloElement.text.trim();
var href = tituloElement.attributes['href'];
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 ?? ''
});
}
}
setState(() {
noticias = noticiasTemp;
_isLoading = false;
});
} else {
throw Exception('Fallo al cargar noticias');
}
} catch (e) {
print('Error al obtener noticias: $e');
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const CustomAppBar(),
body: _isLoading
? Center(child: CircularProgressIndicator())
: BackgroundWidget(
child: ListView.builder(
itemCount: noticias.length,
itemBuilder: (context, index) {
var titulo = noticias[index]['titulo'];
var contenido = noticias[index]['contenido'];
var href = noticias[index]['href'];
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: Text(
contenido!,
style: TextStyle(
fontSize: getResponsiveFontSize(context, 16.0), // Mantener el texto del contenido en estilo regular
),
),
),
],
),
);
},
),
),
bottomNavigationBar: const CustomBottomBar(),
);
}
}

107
lib/pages/pregon Normal file
View File

@ -0,0 +1,107 @@
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 Pregon extends StatefulWidget {
const Pregon({Key? key}) : super(key: key);
@override
_PregonState createState() => _PregonState();
}
class _PregonState extends State<Pregon> {
List<String> datos = [];
@override
void initState() {
super.initState();
obtenerDatos();
}
Future<void> obtenerDatos() async {
final response = await http.get(Uri.parse('https://crcivan.asociacionador.es/pregon.html'));
if (response.statusCode == 200) {
final document = htmlParser.parse(response.body);
// Buscar los elementos <p> dentro de la estructura específica
final elementosParrafos = document.querySelectorAll('body > div > center > table > tbody > tr > td > div > center > table > tbody > tr > td > table > tbody > tr > td > font > font > p');
// Limpiar la lista de datos antes de actualizarla
setState(() {
datos.clear();
});
// Agregar textos de los elementos <p> a la lista, evitando los que contienen solo espacios
for (var elemento in elementosParrafos) {
final texto = elemento.text.trim(); // Eliminar espacios al inicio y al final del texto
if (texto.isNotEmpty) {
setState(() {
datos.add(texto);
});
}
}
} else {
throw Exception('Error al cargar los datos');
}
}
@override
Widget build(BuildContext context) {
// Lista de nombres de los meses del año
final meses = [
'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'
];
return Scaffold(
appBar: const CustomAppBar(),
body: BackgroundWidget(
child: Center(
child: ListView.builder(
itemCount: datos.length,
itemBuilder: (context, index) {
final hasText = datos[index].isNotEmpty;
final hasMes = meses.any((mes) => datos[index].toLowerCase().contains(mes));
return Column(
children: [
if (hasMes)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(color: Colors.green, thickness: 3.0), // Divider antes del párrafo
),
hasText
? ListTile(
title: Center(
child: Text(
datos[index],
textAlign: TextAlign.center,
style: TextStyle(
color: hasMes ? Color.fromARGB(255, 0, 0, 0) : Color.fromARGB(255, 0, 0, 0),
fontSize: getResponsiveFontSize(context, 22.0),
),
),
),
)
: SizedBox.shrink(),
if (hasMes)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 100.0),
child: Divider(color: Colors.green, thickness: 1.0), // Divider después del párrafo
),
],
);
},
shrinkWrap: true, // Ajusta el tamaño de ListView al contenido
),
),
),
bottomNavigationBar: const CustomBottomBar(),
);
}
}

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

@ -0,0 +1,22 @@
import 'package:flutter/material.dart';
class BackgroundWidget extends StatelessWidget {
final Widget child;
const BackgroundWidget({required this.child, super.key});
@override
Widget build(BuildContext context) {
return Stack(
children: [
Positioned.fill(
child: Image.asset(
'assets/logo-fondo-verde.png',
fit: BoxFit.cover,
),
),
child,
],
);
}
}

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

@ -6,6 +6,10 @@
#include "generated_plugin_registrant.h"
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
}

View File

@ -3,6 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
url_launcher_linux
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST

View File

@ -5,6 +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,6 +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: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
url: "https://pub.dev"
source: hosted
version: "2.6.0"
async:
dependency: transitive
description:
@ -9,6 +25,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.11.0"
bloc:
dependency: transitive
description:
name: bloc
sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
url: "https://pub.dev"
source: hosted
version: "8.1.4"
boolean_selector:
dependency: transitive
description:
@ -17,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:
@ -25,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:
@ -37,10 +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: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
cupertino_icons:
dependency: "direct main"
description:
@ -57,11 +121,43 @@ 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
source: sdk
version: "0.0.0"
flutter_bloc:
dependency: "direct main"
description:
name: flutter_bloc
sha256: b594505eac31a0518bdcb4b5b79573b8d9117b193cc80cc12e17d639b10aa27a
url: "https://pub.dev"
source: hosted
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:
@ -70,35 +166,88 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.2"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
url: "https://pub.dev"
source: hosted
version: "2.0.17"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
html:
dependency: "direct dev"
description:
name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
url: "https://pub.dev"
source: hosted
version: "0.15.4"
http:
dependency: "direct dev"
description:
name: http
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.3.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
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:
@ -119,18 +268,26 @@ 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:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
path:
dependency: transitive
description:
@ -139,11 +296,139 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev"
source: hosted
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:
name: petitparser
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
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:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
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:
name: provider
sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
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:
@ -156,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:
@ -172,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:
@ -188,10 +473,106 @@ 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: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
url: "https://pub.dev"
source: hosted
version: "6.3.2"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
url: "https://pub.dev"
source: hosted
version: "3.2.2"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "7ed22c21d7fdcc88dd6ba7860384af438cd220b251ad65dfc142ab722fabef61"
url: "https://pub.dev"
source: hosted
version: "1.1.16"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146"
url: "https://pub.dev"
source: hosted
version: "1.1.13"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
url: "https://pub.dev"
source: hosted
version: "1.1.16"
vector_math:
dependency: transitive
description:
@ -204,9 +585,42 @@ 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: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
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:
name: xml
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
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"
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
@ -30,11 +30,20 @@ environment:
dependencies:
flutter:
sdk: flutter
url_launcher: ^6.0.12
flutter_bloc: ^8.1.5
flutter_svg: ^2.0.10+1
shared_preferences: ^2.2.0
# 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:
@ -46,10 +55,17 @@ dev_dependencies:
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
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:
@ -62,6 +78,11 @@ flutter:
assets:
- assets/logo-civan.png
- assets/agua.jpg
- assets/logo-fondo.png
- 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.dart';
import 'package:crcivan/main/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {

View File

@ -6,6 +6,9 @@
#include "generated_plugin_registrant.h"
#include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
}

View File

@ -3,6 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
url_launcher_windows
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST