Browse Source

Calendario

Parte del calendario para citas
JorgeIan 4 years ago
parent
commit
a7dea4c802
2 changed files with 424 additions and 0 deletions
  1. 347
    0
      Jorge/main.dart
  2. 77
    0
      Jorge/pubspec.yaml

+ 347
- 0
Jorge/main.dart View File

@@ -0,0 +1,347 @@
1
+import 'package:flutter/material.dart';
2
+import 'package:intl/date_symbol_data_local.dart';
3
+import 'package:table_calendar/table_calendar.dart';
4
+
5
+// Dias sin Citas Disponibles
6
+final Map<DateTime, List> _holidays = {
7
+  DateTime(2020, 11, 6): ['No Hay Citas'],
8
+  DateTime(2020, 11, 3): ['Dia Elecciones'],
9
+
10
+};
11
+
12
+void main() {
13
+  initializeDateFormatting().then((_) => runApp(MyApp()));
14
+}
15
+
16
+
17
+
18
+class MyApp extends StatelessWidget {
19
+  @override
20
+  Widget build(BuildContext context) {
21
+    return MaterialApp(
22
+      title: 'Citas Disponibles',
23
+      theme: ThemeData(
24
+        primarySwatch: Colors.blue,
25
+      ),
26
+      home: MyHomePage(title: 'Citas Disponibles'),
27
+    );
28
+  }
29
+}
30
+
31
+class MyHomePage extends StatefulWidget {
32
+  MyHomePage({Key key, this.title}) : super(key: key);
33
+
34
+  final String title;
35
+
36
+  @override
37
+  _MyHomePageState createState() => _MyHomePageState();
38
+}
39
+
40
+class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
41
+  Map<DateTime, List> _events;
42
+  List _selectedEvents;
43
+  AnimationController _animationController;
44
+  CalendarController _calendarController;
45
+
46
+  @override
47
+  void initState() {
48
+    super.initState();
49
+    final _selectedDay = DateTime.now();
50
+
51
+    _events = {
52
+
53
+      _selectedDay.add(Duration(days: 3)): Set.from([ 'Cita Cardiologo', 'Cita Dentista']).toList(),
54
+      _selectedDay.add(Duration(days: 22)): ['Cita Cardiologo', 'Cita Dentista'],
55
+
56
+    };
57
+
58
+    _selectedEvents = _events[_selectedDay] ?? [];
59
+    _calendarController = CalendarController();
60
+
61
+    _animationController = AnimationController(
62
+      vsync: this,
63
+      duration: const Duration(milliseconds: 400),
64
+    );
65
+
66
+    _animationController.forward();
67
+  }
68
+
69
+  @override
70
+  void dispose() {
71
+    _animationController.dispose();
72
+    _calendarController.dispose();
73
+    super.dispose();
74
+  }
75
+
76
+  void _onDaySelected(DateTime day, List events, List holidays) {
77
+    print('CALLBACK: _onDaySelected');
78
+    setState(() {
79
+      _selectedEvents = events;
80
+    });
81
+  }
82
+
83
+  void _onVisibleDaysChanged(DateTime first, DateTime last, CalendarFormat format) {
84
+    print('CALLBACK: _onVisibleDaysChanged');
85
+  }
86
+
87
+  void _onCalendarCreated(DateTime first, DateTime last, CalendarFormat format) {
88
+    print('CALLBACK: _onCalendarCreated');
89
+  }
90
+
91
+  @override
92
+  Widget build(BuildContext context) {
93
+    return Scaffold(
94
+      appBar: AppBar(
95
+        title: Text(widget.title),
96
+      ),
97
+      body: Column(
98
+        mainAxisSize: MainAxisSize.max,
99
+        children: <Widget>[
100
+          // Switch out 2 lines below to play with TableCalendar's settings
101
+          //-----------------------
102
+          _buildTableCalendar(),
103
+          // _buildTableCalendarWithBuilders(),
104
+          const SizedBox(height: 8.0),
105
+          _buildButtons(),
106
+          const SizedBox(height: 8.0),
107
+          Expanded(child: _buildEventList()),
108
+        ],
109
+      ),
110
+    );
111
+  }
112
+  //Back button
113
+  Widget BackButton(BuildContext context){
114
+    return InkWell(
115
+      onTap: (){
116
+        Navigator.pop(context);
117
+      },
118
+      child: Row(
119
+          children: <Widget>[
120
+            Container(
121
+              padding: EdgeInsets.only(left: 0, top:10, bottom: 10),
122
+              child: Icon(Icons.arrow_back_ios, color: Colors.black),
123
+            ),
124
+            Text("Black",
125
+                style: TextStyle(fontSize: 12, fontWeight: FontWeight.w500))
126
+          ]
127
+      ),
128
+    );
129
+  }
130
+
131
+  // Simple TableCalendar configuration (using Styles)
132
+  Widget _buildTableCalendar() {
133
+    return TableCalendar(
134
+      calendarController: _calendarController,
135
+      events: _events,
136
+      holidays: _holidays,
137
+      startingDayOfWeek: StartingDayOfWeek.monday,
138
+      calendarStyle: CalendarStyle(
139
+        selectedColor: Colors.lightBlueAccent,
140
+        todayColor: Colors.blueAccent,
141
+        markersColor: Colors.brown,
142
+        outsideDaysVisible: false,
143
+      ),
144
+      headerStyle: HeaderStyle(
145
+        formatButtonTextStyle: TextStyle().copyWith(color: Colors.white, fontSize: 15.0),
146
+        formatButtonDecoration: BoxDecoration(
147
+          color: Colors.lightBlue,
148
+          borderRadius: BorderRadius.circular(16.0),
149
+        ),
150
+      ),
151
+      onDaySelected: _onDaySelected,
152
+      onVisibleDaysChanged: _onVisibleDaysChanged,
153
+      onCalendarCreated: _onCalendarCreated,
154
+    );
155
+  }
156
+
157
+  // More advanced TableCalendar configuration (using Builders & Styles)
158
+  Widget _buildTableCalendarWithBuilders() {
159
+    return TableCalendar(
160
+      locale: 'pl_PL',
161
+      calendarController: _calendarController,
162
+      events: _events,
163
+      holidays: _holidays,
164
+      initialCalendarFormat: CalendarFormat.month,
165
+      formatAnimation: FormatAnimation.slide,
166
+      startingDayOfWeek: StartingDayOfWeek.sunday,
167
+      availableGestures: AvailableGestures.all,
168
+      availableCalendarFormats: const {
169
+        CalendarFormat.month: '',
170
+        CalendarFormat.week: '',
171
+      },
172
+      calendarStyle: CalendarStyle(
173
+        outsideDaysVisible: false,
174
+        weekendStyle: TextStyle().copyWith(color: Colors.blue),
175
+        holidayStyle: TextStyle().copyWith(color: Colors.blue),
176
+      ),
177
+      daysOfWeekStyle: DaysOfWeekStyle(
178
+        weekendStyle: TextStyle().copyWith(color: Colors.blue),
179
+      ),
180
+      headerStyle: HeaderStyle(
181
+        centerHeaderTitle: true,
182
+        formatButtonVisible: false,
183
+      ),
184
+      builders: CalendarBuilders(
185
+        selectedDayBuilder: (context, date, _) {
186
+          return FadeTransition(
187
+            opacity: Tween(begin: 0.0, end: 1.0).animate(_animationController),
188
+            child: Container(
189
+              margin: const EdgeInsets.all(4.0),
190
+              padding: const EdgeInsets.only(top: 5.0, left: 6.0),
191
+              color: Colors.green,
192
+              width: 100,
193
+              height: 100,
194
+              child: Text(
195
+                '${date.day}',
196
+                style: TextStyle().copyWith(fontSize: 16.0),
197
+              ),
198
+            ),
199
+          );
200
+        },
201
+        todayDayBuilder: (context, date, _) {
202
+          return Container(
203
+            margin: const EdgeInsets.all(4.0),
204
+            padding: const EdgeInsets.only(top: 5.0, left: 6.0),
205
+            color: Colors.amber,
206
+            width: 100,
207
+            height: 100,
208
+            child: Text(
209
+              '${date.day}',
210
+              style: TextStyle().copyWith(fontSize: 16.0),
211
+            ),
212
+          );
213
+        },
214
+        markersBuilder: (context, date, events, holidays) {
215
+          final children = <Widget>[];
216
+
217
+          if (events.isNotEmpty) {
218
+            children.add(
219
+              Positioned(
220
+                right: 1,
221
+                bottom: 1,
222
+                child: _buildEventsMarker(date, events),
223
+              ),
224
+            );
225
+          }
226
+
227
+          if (holidays.isNotEmpty) {
228
+            children.add(
229
+              Positioned(
230
+                right: -2,
231
+                top: -2,
232
+                child: _buildHolidaysMarker(),
233
+              ),
234
+            );
235
+          }
236
+
237
+          return children;
238
+        },
239
+      ),
240
+      onDaySelected: (date, events, holidays) {
241
+        _onDaySelected(date, events, holidays);
242
+        _animationController.forward(from: 0.0);
243
+      },
244
+      onVisibleDaysChanged: _onVisibleDaysChanged,
245
+      onCalendarCreated: _onCalendarCreated,
246
+    );
247
+  }
248
+
249
+  Widget _buildEventsMarker(DateTime date, List events) {
250
+    return AnimatedContainer(
251
+      duration: const Duration(milliseconds: 300),
252
+      decoration: BoxDecoration(
253
+        shape: BoxShape.rectangle,
254
+        color: _calendarController.isSelected(date)
255
+            ? Colors.brown[500]
256
+            : _calendarController.isToday(date) ? Colors.brown : Colors.blue,
257
+      ),
258
+      width: 16.0,
259
+      height: 16.0,
260
+      child: Center(
261
+        child: Text(
262
+          '${events.length}',
263
+          style: TextStyle().copyWith(
264
+            color: Colors.green,
265
+            fontSize: 12.0,
266
+          ),
267
+        ),
268
+      ),
269
+    );
270
+  }
271
+
272
+  Widget _buildHolidaysMarker() {
273
+    return Icon(
274
+      Icons.add_box,
275
+      size: 20.0,
276
+      color: Colors.blueGrey,
277
+    );
278
+  }
279
+
280
+  Widget _buildButtons() {
281
+    final dateTime = _events.keys.elementAt(_events.length - 2);
282
+
283
+    return Column(
284
+      children: <Widget>[
285
+        Row(
286
+          mainAxisSize: MainAxisSize.max,
287
+          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
288
+          children: <Widget>[
289
+            RaisedButton(
290
+              child: Text('Mes'),
291
+              onPressed: () {
292
+                setState(() {
293
+                  _calendarController.setCalendarFormat(CalendarFormat.month);
294
+                });
295
+              },
296
+            ),
297
+            RaisedButton(
298
+              child: Text('2 Semanas'),
299
+              onPressed: () {
300
+                setState(() {
301
+                  _calendarController.setCalendarFormat(CalendarFormat.twoWeeks);
302
+                });
303
+              },
304
+            ),
305
+            RaisedButton(
306
+              child: Text('Semana'),
307
+              onPressed: () {
308
+                setState(() {
309
+                  _calendarController.setCalendarFormat(CalendarFormat.week);
310
+                });
311
+              },
312
+            ),
313
+          ],
314
+        ),
315
+        const SizedBox(height: 8.0),
316
+        RaisedButton(
317
+          child: Text('Recuerde Cita ${dateTime.day}-${dateTime.month}-${dateTime.year}'),
318
+          onPressed: () {
319
+            _calendarController.setSelectedDay(
320
+              DateTime(dateTime.year, dateTime.month, dateTime.day),
321
+              runCallback: true,
322
+            );
323
+          },
324
+        ),
325
+      ],
326
+    );
327
+  }
328
+
329
+
330
+  Widget _buildEventList() {
331
+    return ListView(
332
+      children: _selectedEvents
333
+          .map((event) => Container(
334
+        decoration: BoxDecoration(
335
+          border: Border.all(width: 0.8),
336
+          borderRadius: BorderRadius.circular(12.0),
337
+        ),
338
+        margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
339
+        child: ListTile(
340
+          title: Text(event.toString()),
341
+          onTap: () => print('$event tapped!'),
342
+        ),
343
+      ))
344
+          .toList(),
345
+    );
346
+  }
347
+}

+ 77
- 0
Jorge/pubspec.yaml View File

@@ -0,0 +1,77 @@
1
+name: flutter_app7
2
+description: A new Flutter application.
3
+
4
+# The following line prevents the package from being accidentally published to
5
+# pub.dev using `pub publish`. This is preferred for private packages.
6
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
7
+
8
+# The following defines the version and build number for your application.
9
+# A version number is three numbers separated by dots, like 1.2.43
10
+# followed by an optional build number separated by a +.
11
+# Both the version and the builder number may be overridden in flutter
12
+# build by specifying --build-name and --build-number, respectively.
13
+# In Android, build-name is used as versionName while build-number used as versionCode.
14
+# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
15
+# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
16
+# Read more about iOS versioning at
17
+# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18
+version: 1.0.0+1
19
+
20
+environment:
21
+  sdk: ">=2.7.0 <3.0.0"
22
+
23
+dependencies:
24
+  flutter:
25
+    sdk: flutter
26
+
27
+
28
+  # The following adds the Cupertino Icons font to your application.
29
+  # Use with the CupertinoIcons class for iOS style icons.
30
+  cupertino_icons: ^1.0.0
31
+  table_calendar: ^2,0,1
32
+
33
+dev_dependencies:
34
+  flutter_test:
35
+    sdk: flutter
36
+
37
+# For information on the generic Dart part of this file, see the
38
+# following page: https://dart.dev/tools/pub/pubspec
39
+
40
+# The following section is specific to Flutter.
41
+flutter:
42
+
43
+  # The following line ensures that the Material Icons font is
44
+  # included with your application, so that you can use the icons in
45
+  # the material Icons class.
46
+  uses-material-design: true
47
+
48
+  # To add assets to your application, add an assets section, like this:
49
+  # assets:
50
+  #   - images/a_dot_burr.jpeg
51
+  #   - images/a_dot_ham.jpeg
52
+
53
+  # An image asset can refer to one or more resolution-specific "variants", see
54
+  # https://flutter.dev/assets-and-images/#resolution-aware.
55
+
56
+  # For details regarding adding assets from package dependencies, see
57
+  # https://flutter.dev/assets-and-images/#from-packages
58
+
59
+  # To add custom fonts to your application, add a fonts section here,
60
+  # in this "flutter" section. Each entry in this list should have a
61
+  # "family" key with the font family name, and a "fonts" key with a
62
+  # list giving the asset and other descriptors for the font. For
63
+  # example:
64
+  # fonts:
65
+  #   - family: Schyler
66
+  #     fonts:
67
+  #       - asset: fonts/Schyler-Regular.ttf
68
+  #       - asset: fonts/Schyler-Italic.ttf
69
+  #         style: italic
70
+  #   - family: Trajan Pro
71
+  #     fonts:
72
+  #       - asset: fonts/TrajanPro.ttf
73
+  #       - asset: fonts/TrajanPro_Bold.ttf
74
+  #         weight: 700
75
+  #
76
+  # For details regarding fonts from package dependencies,
77
+  # see https://flutter.dev/custom-fonts/#from-packages