我正在尝试实现一个日历,在该日历中它从我的数据库中获取日期信息,之后它与首先找到的日期相符(我正在尝试假期),但是在示例中,我从table_calendar小部件中找到了它使用的地图列表我并没有从动态流行起来,我的想法是通过getCalendar()方法向我的php服务器发出请求,它返回一个带有信息的json,到目前为止,我还不能将数据放在列表中_holidays如您在我的代码中看到的,有人可以帮助我吗?下面是我的完整代码:
// Copyright (c) 2019 Aleksander Woźniak
// Licensed under Apache License v2.0
import 'package:flutter/material.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:table_calendar/table_calendar.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
// Holidays
Map<DateTime, List> _holidays = {
DateTime(2019, 1, 1): ['New Year\'s Day'],
DateTime(2019, 1, 6): ['Epiphany'],
DateTime(2019, 2, 14): ['Valentine\'s Day'],
DateTime(2019, 4, 21): ['Easter Sunday'],
DateTime(2019, 4, 22): ['Easter Monday'],
};
void main() {
initializeDateFormatting().then((_) => runApp(MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Calendar',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Calendar'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
Map<DateTime, List> _events;
List _selectedEvents;
AnimationController _animationController;
CalendarController _calendarController;
Future<Null> getCalendar() async {
var url =
"http://192.168.0.11/sistema/appCalendario.php?LgeOffID=1&LgeEmpID=115&bd=ac01";
var client = new http.Client();
try {
final response = await client.get(url);
final result = json.decode(response.body);
setState(() {
listholidays = result['Holidays'];
/*
listholidays - Array('FerDay','FerMounth','FerYear','Ferdesc')
*/
for (int i = 0; i < listholidays.length; i++) {}
});
} finally {
client.close();
}
}
@override
void initState() {
super.initState();
getCalendar();
final _selectedDay = DateTime.now();
_events = {
/*_selectedDay.subtract(Duration(days: 30)): [
'Event A0',
'Event B0',
'Event C0'
],
_selectedDay.subtract(Duration(days: 27)): ['Event A1'],
_selectedDay.subtract(Duration(days: 20)): [
'Event A2',
'Event B2',
'Event C2',
'Event D2'
],
_selectedDay.subtract(Duration(days: 16)): ['Event A3', 'Event B3'],
_selectedDay.subtract(Duration(days: 10)): [
'Event A4',
'Event B4',
'Event C4'
],
_selectedDay.subtract(Duration(days: 4)): [
'Event A5',
'Event B5',
'Event C5'
],
_selectedDay.subtract(Duration(days: 2)): ['Event A6', 'Event B6'],
_selectedDay: ['Event A7', 'Event B7', 'Event C7', 'Event D7'],
_selectedDay.add(Duration(days: 1)): [
'Event A8',
'Event B8',
'Event C8',
'Event D8'
],
_selectedDay.add(Duration(days: 3)):
Set.from(['Event A9', 'Event A9', 'Event B9']).toList(),
_selectedDay.add(Duration(days: 7)): [
'Event A10',
'Event B10',
'Event C10'
],
_selectedDay.add(Duration(days: 11)): ['Event A11', 'Event B11'],
_selectedDay.add(Duration(days: 17)): [
'Event A12',
'Event B12',
'Event C12',
'Event D12'
],
_selectedDay.add(Duration(days: 22)): ['Event A13', 'Event B13'],
_selectedDay.add(Duration(days: 26)): [
'Event A14',
'Event B14',
'Event C14'
],*/
};
_selectedEvents = _events[_selectedDay] ?? [];
_calendarController = CalendarController();
_animationController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 400),
);
_animationController.forward();
}
@override
void dispose() {
_animationController.dispose();
_calendarController.dispose();
super.dispose();
}
void _onDaySelected(DateTime day, List events) {
print('CALLBACK: _onDaySelected');
setState(() {
_selectedEvents = events;
});
}
void _onVisibleDaysChanged(
DateTime first, DateTime last, CalendarFormat format) {
print('CALLBACK: _onVisibleDaysChanged');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
// Switch out 2 lines below to play with TableCalendar's settings
//-----------------------
_buildTableCalendar(),
// _buildTableCalendarWithBuilders(),
/*const SizedBox(height: 8.0),
_buildButtons(),*/
const SizedBox(height: 8.0),
Expanded(child: _buildEventList()),
],
),
);
}
// Simple TableCalendar configuration (using Styles)
Widget _buildTableCalendar() {
return TableCalendar(
locale: 'pt_BR',
calendarController: _calendarController,
events: _events,
holidays: _holidays,
startingDayOfWeek: StartingDayOfWeek.monday,
calendarStyle: CalendarStyle(
selectedColor: Colors.deepOrange[400],
todayColor: Colors.deepOrange[200],
markersColor: Colors.brown[700],
outsideDaysVisible: false,
),
headerStyle: HeaderStyle(
formatButtonTextStyle:
TextStyle().copyWith(color: Colors.white, fontSize: 15.0),
formatButtonDecoration: BoxDecoration(
color: Colors.deepOrange[400],
borderRadius: BorderRadius.circular(16.0),
),
),
onDaySelected: _onDaySelected,
onVisibleDaysChanged: _onVisibleDaysChanged,
);
}
// More advanced TableCalendar configuration (using Builders & Styles)
Widget _buildTableCalendarWithBuilders() {
return TableCalendar(
locale: 'pt_BR',
calendarController: _calendarController,
events: _events,
holidays: _holidays,
initialCalendarFormat: CalendarFormat.month,
formatAnimation: FormatAnimation.slide,
startingDayOfWeek: StartingDayOfWeek.sunday,
availableGestures: AvailableGestures.all,
availableCalendarFormats: const {
CalendarFormat.month: '',
CalendarFormat.week: '',
},
calendarStyle: CalendarStyle(
outsideDaysVisible: false,
weekendStyle: TextStyle().copyWith(color: Colors.blue[800]),
holidayStyle: TextStyle().copyWith(color: Colors.blue[800]),
),
daysOfWeekStyle: DaysOfWeekStyle(
weekendStyle: TextStyle().copyWith(color: Colors.blue[600]),
),
headerStyle: HeaderStyle(
centerHeaderTitle: true,
formatButtonVisible: false,
),
builders: CalendarBuilders(
selectedDayBuilder: (context, date, _) {
return FadeTransition(
opacity: Tween(begin: 0.0, end: 1.0).animate(_animationController),
child: Container(
margin: const EdgeInsets.all(4.0),
padding: const EdgeInsets.only(top: 5.0, left: 6.0),
color: Colors.deepOrange[300],
width: 100,
height: 100,
child: Text(
'${date.day}',
style: TextStyle().copyWith(fontSize: 16.0),
),
),
);
},
todayDayBuilder: (context, date, _) {
return Container(
margin: const EdgeInsets.all(4.0),
padding: const EdgeInsets.only(top: 5.0, left: 6.0),
color: Colors.amber[400],
width: 100,
height: 100,
child: Text(
'${date.day}',
style: TextStyle().copyWith(fontSize: 16.0),
),
);
},
markersBuilder: (context, date, events, holidays) {
final children = <Widget>[];
if (events.isNotEmpty) {
children.add(
Positioned(
right: 1,
bottom: 1,
child: _buildEventsMarker(date, events),
),
);
}
if (holidays.isNotEmpty) {
children.add(
Positioned(
right: -2,
top: -2,
child: _buildHolidaysMarker(),
),
);
}
return children;
},
),
onDaySelected: (date, events) {
_onDaySelected(date, events);
_animationController.forward(from: 0.0);
},
onVisibleDaysChanged: _onVisibleDaysChanged,
);
}
Widget _buildEventsMarker(DateTime date, List events) {
return AnimatedContainer(
duration: const Duration(milliseconds: 300),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: _calendarController.isSelected(date)
? Colors.brown[500]
: _calendarController.isToday(date)
? Colors.brown[300]
: Colors.blue[400],
),
width: 16.0,
height: 16.0,
child: Center(
child: Text(
'${events.length}',
style: TextStyle().copyWith(
color: Colors.white,
fontSize: 12.0,
),
),
),
);
}
Widget _buildHolidaysMarker() {
return Icon(
Icons.add_box,
size: 20.0,
color: Colors.blueGrey[800],
);
}
Widget _buildEventList() {
return ListView(
children: _selectedEvents
.map((event) => Container(
decoration: BoxDecoration(
border: Border.all(width: 0.8),
borderRadius: BorderRadius.circular(12.0),
),
margin:
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
child: ListTile(
title: Text(event.toString()),
onTap: () => print('$event tapped!'),
),
))
.toList(),
);
}
}
var listholidays = [];
请注意,我的getCalendar()方法会获取数据,并且在我扫描列表假日的位置,我想向_holidays添加新元素,这是我的列表地图
我尝试进行以下更改:
Future<Null> getCalendar() async {
var url =
"http://192.168.0.11/sistema/appCalendario.php?LgeOffID=1&LgeEmpID=115&bd=ac01";
var client = new http.Client();
try {
final response = await client.get(url);
final result = json.decode(response.body);
setState(() {
listholidays = result['holidays'];
var data, aux = [];
int day = 0, month = 0, year = 0;
for (int i = 0; i < listholidays.length; i++) {
aux.add(listholidays[i]['FerDesc']);
}
for (int i = 0; i < listholidays.length; i++) {
year = int.parse(listholidays[i]['Feryear']);
month = int.parse(listholidays[i]['Fermonth']);
day = int.parse(listholidays[i]['Ferday']);
data = new DateTime(year, month, day);
_holidays.map(data: aux);
}
});
} finally {
client.close();
}
}
但是出现以下错误: 预期需要1个自变量,但找到0个。 尝试添加其他必需的参数。dart(not_enough_required_arguments)
未定义命名参数“数据”。 尝试将名称更正为现有的命名参数,或使用此名称设置新参数。dart(undefined_named_parameter)
我不明白为什么我在示例中没有定义参数