- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想显示日历和包括事件,该事件已经存在于 API 中。我搜索适合我的情况的插件,我找到了 Table Calendar Plugin .我阅读了手动显示事件的示例并找到了它:
@override
void initState() {
super.initState();
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();
}
但是上面显示事件的示例是静态的,我需要从我的 API 向 Table Calendar 显示事件已经存在动态地。
我是这个包裹的新手,我该如何处理我的案子?
{
"status": "ok",
"message": "Event Is Found",
"data": [
{
"kodeEvent": "1",
"tanggalEvent": "2020-01-15",
"judulEvent": "Bangun Kembali 200 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Lombok",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8cd198530_202002181405.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "0",
"createTime": "2020-01-29 16:37:26",
"updateBy": "",
"updateTime": "2020-02-18 14:05:53"
},
{
"kodeEvent": "2",
"tanggalEvent": "2020-03-31",
"judulEvent": "Bangun Kembali 100 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Jakarta",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8d3d74b44_202002181407.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "",
"createTime": "2020-02-18 14:07:41",
"updateBy": "",
"updateTime": "0000-00-00 00:00:00"
},
{
"kodeEvent": "3",
"tanggalEvent": "2020-01-31",
"judulEvent": "Bangun Kembali 200 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Bandung",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8d72e2d37_202002181408.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "",
"createTime": "2020-02-18 14:08:34",
"updateBy": "",
"updateTime": "0000-00-00 00:00:00"
}
]
}
import 'dart:convert';
class EventModel {
String kodeEvent;
DateTime tanggalEvent;
String judulEvent;
String lokasiEvent;
String isiEvent;
String fotoEvent;
String waktuEvent;
String statusEvent;
String createBy;
DateTime createTime;
String updateBy;
String updateTime;
EventModel({
this.kodeEvent,
this.tanggalEvent,
this.judulEvent,
this.lokasiEvent,
this.isiEvent,
this.fotoEvent,
this.waktuEvent,
this.statusEvent,
this.createBy,
this.createTime,
this.updateBy,
this.updateTime,
});
factory EventModel.fromJson(Map<String, dynamic> json) => EventModel(
kodeEvent: json["kodeEvent"],
tanggalEvent: DateTime.parse(json["tanggalEvent"]),
judulEvent: json["judulEvent"],
lokasiEvent: json["lokasiEvent"],
isiEvent: json["isiEvent"],
fotoEvent: json["fotoEvent"],
waktuEvent: json["waktuEvent"],
statusEvent: json["statusEvent"],
createBy: json["createBy"],
createTime: DateTime.parse(json["createTime"]),
updateBy: json["updateBy"],
updateTime: json["updateTime"],
);
}
class _EventScreenState extends State<EventScreen> {
Future<List<EventModel>> getAllEvent;
CalendarController calendarController;
@override
void initState() {
super.initState();
calendarController = CalendarController();
getAllEvent = eventApi.getAllEvent();
}
@override
void dispose() {
calendarController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
TableCalendar(
calendarController: calendarController,
startingDayOfWeek: StartingDayOfWeek.monday,
events: ,
),
FutureBuilder(
future: getAllEvent,
builder: (BuildContext context,
AsyncSnapshot<List<EventModel>> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return ErrorFutureBuilder(errorText: snapshot.error);
} else {
return ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
final result = snapshot.data[index];
return Text(result.tanggalEvent);
},
);
}
} else {
return LoadingFutureBuilder();
}
},
),
],
),
);
}
}
Future<List<EventModel>> getAllEvent() async {
try {
final response = await http.get(_baseUrl);
final Map<String, dynamic> responseJson = json.decode(response.body);
if (responseJson["status"] == "ok") {
List eventList = responseJson['data'];
final result = eventList
.map<EventModel>((json) => EventModel.fromJson(json))
.toList();
return result;
} else {
throw CustomError(responseJson['message']);
}
} catch (e) {
return Future.error(e.toString());
}
}
最佳答案
您可以在下面复制粘贴运行完整代码
我用 3 秒模拟网络延迟。
您模型的代码片段
Future<Map<DateTime, List>> getTask1() async {
Map<DateTime, List> mapFetch = {};
List<EventModel> event = await getAllEvent();
for (int i = 0; i < event.length; i++) {
var createTime = DateTime(event[i].createTime.year,
event[i].createTime.month, event[i].createTime.day);
var original = mapFetch[createTime];
if (original == null) {
print("null");
mapFetch[createTime] = [event[i].tanggalEvent];
} else {
print(event[i].tanggalEvent);
mapFetch[createTime] = List.from(original)
..addAll([event[i].tanggalEvent]);
}
}
return mapFetch;
}
代码片段
WidgetsBinding.instance.addPostFrameCallback((_) {
getTask().then((val) => setState(() {
_events = val;
}));
//print( ' ${_events.toString()} ');
});
Future<Map<DateTime, List>> getTask() async {
Map<DateTime, List> mapFetch = {};
await Future.delayed(const Duration(seconds: 3), () {});
String responseString = '''
{
"status": "ok",
"message": "Event Is Found",
...
Event event = eventFromJson(responseString);
for (int i = 0; i < event.data.length; i++) {
var createTime = DateTime(event.data[i].createTime.year,
event.data[i].createTime.month, event.data[i].createTime.day);
var original = mapFetch[createTime];
if (original == null) {
print("null");
mapFetch[createTime] = [event.data[i].tanggalEvent];
} else {
print(event.data[i].tanggalEvent);
mapFetch[createTime] = List.from(original)..addAll([event.data[i].tanggalEvent]);
}
}
return mapFetch;
}
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:table_calendar/table_calendar.dart';
import 'dart:convert';
Event eventFromJson(String str) => Event.fromJson(json.decode(str));
String eventToJson(Event data) => json.encode(data.toJson());
class Event {
String status;
String message;
List<Datum> data;
Event({
this.status,
this.message,
this.data,
});
factory Event.fromJson(Map<String, dynamic> json) => Event(
status: json["status"],
message: json["message"],
data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"status": status,
"message": message,
"data": List<dynamic>.from(data.map((x) => x.toJson())),
};
}
class Datum {
String kodeEvent;
DateTime tanggalEvent;
String judulEvent;
String lokasiEvent;
String isiEvent;
String fotoEvent;
String waktuEvent;
String statusEvent;
String createBy;
DateTime createTime;
String updateBy;
String updateTime;
Datum({
this.kodeEvent,
this.tanggalEvent,
this.judulEvent,
this.lokasiEvent,
this.isiEvent,
this.fotoEvent,
this.waktuEvent,
this.statusEvent,
this.createBy,
this.createTime,
this.updateBy,
this.updateTime,
});
factory Datum.fromJson(Map<String, dynamic> json) => Datum(
kodeEvent: json["kodeEvent"],
tanggalEvent: DateTime.parse(json["tanggalEvent"]),
judulEvent: json["judulEvent"],
lokasiEvent: json["lokasiEvent"],
isiEvent: json["isiEvent"],
fotoEvent: json["fotoEvent"],
waktuEvent: json["waktuEvent"],
statusEvent: json["statusEvent"],
createBy: json["createBy"],
createTime: DateTime.parse(json["createTime"]),
updateBy: json["updateBy"],
updateTime: json["updateTime"],
);
Map<String, dynamic> toJson() => {
"kodeEvent": kodeEvent,
"tanggalEvent":
"${tanggalEvent.year.toString().padLeft(4, '0')}-${tanggalEvent.month.toString().padLeft(2, '0')}-${tanggalEvent.day.toString().padLeft(2, '0')}",
"judulEvent": judulEvent,
"lokasiEvent": lokasiEvent,
"isiEvent": isiEvent,
"fotoEvent": fotoEvent,
"waktuEvent": waktuEvent,
"statusEvent": statusEvent,
"createBy": createBy,
"createTime": createTime.toIso8601String(),
"updateBy": updateBy,
"updateTime": updateTime,
};
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
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 {
List _selectedEvents;
int _counter = 0;
Map<DateTime, List> _events;
CalendarController _calendarController;
AnimationController _animationController;
void _incrementCounter() {
setState(() {
_counter++;
});
}
Future<List<EventModel>> getAllEvent() async {
try {
//final response = await http.get(_baseUrl);
String responseString = '''
{
"status": "ok",
"message": "Event Is Found",
"data": [
{
"kodeEvent": "1",
"tanggalEvent": "2020-01-15",
"judulEvent": "Bangun Kembali 200 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Lombok",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8cd198530_202002181405.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "0",
"createTime": "2020-01-29 16:37:26",
"updateBy": "",
"updateTime": "2020-02-18 14:05:53"
},
{
"kodeEvent": "2",
"tanggalEvent": "2020-03-31",
"judulEvent": "Bangun Kembali 100 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Jakarta",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8d3d74b44_202002181407.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "",
"createTime": "2020-02-18 14:07:41",
"updateBy": "",
"updateTime": "0000-00-00 00:00:00"
},
{
"kodeEvent": "3",
"tanggalEvent": "2020-01-31",
"judulEvent": "Bangun Kembali 200 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Bandung",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8d72e2d37_202002181408.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "",
"createTime": "2020-02-18 14:08:34",
"updateBy": "",
"updateTime": "0000-00-00 00:00:00"
}
]
}
''';
final Map<String, dynamic> responseJson = json.decode(responseString);
if (responseJson["status"] == "ok") {
List eventList = responseJson['data'];
final result = eventList
.map<EventModel>((json) => EventModel.fromJson(json))
.toList();
return result;
} else {
//throw CustomError(responseJson['message']);
}
} catch (e) {
return Future.error(e.toString());
}
}
Future<Map<DateTime, List>> getTask1() async {
Map<DateTime, List> mapFetch = {};
List<EventModel> event = await getAllEvent();
for (int i = 0; i < event.length; i++) {
var createTime = DateTime(event[i].createTime.year,
event[i].createTime.month, event[i].createTime.day);
var original = mapFetch[createTime];
if (original == null) {
print("null");
mapFetch[createTime] = [event[i].tanggalEvent];
} else {
print(event[i].tanggalEvent);
mapFetch[createTime] = List.from(original)
..addAll([event[i].tanggalEvent]);
}
}
return mapFetch;
}
Future<Map<DateTime, List>> getTask() async {
Map<DateTime, List> mapFetch = {};
await Future.delayed(const Duration(seconds: 3), () {});
/*String link = baseURL + fetchTodoByDate;
var res = await http.post(Uri.encodeFull(link), headers: {"Accept": "application/json"});
if (res.statusCode == 200) {
// need help in creating fetch logic here
}*/
String responseString = '''
{
"status": "ok",
"message": "Event Is Found",
"data": [
{
"kodeEvent": "1",
"tanggalEvent": "2020-01-15",
"judulEvent": "Bangun Kembali 200 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Lombok",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8cd198530_202002181405.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "0",
"createTime": "2020-01-29 16:37:26",
"updateBy": "",
"updateTime": "2020-02-18 14:05:53"
},
{
"kodeEvent": "2",
"tanggalEvent": "2020-03-31",
"judulEvent": "Bangun Kembali 100 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Jakarta",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8d3d74b44_202002181407.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "",
"createTime": "2020-02-18 14:07:41",
"updateBy": "",
"updateTime": "0000-00-00 00:00:00"
},
{
"kodeEvent": "3",
"tanggalEvent": "2020-01-31",
"judulEvent": "Bangun Kembali 200 Masjid dan Mushalla Anti Gempa",
"lokasiEvent": "Bandung",
"isiEvent": "Gempa Bumi dahsyat bertubi-tubi guncang lombok, kini Pulau seribu Masjid lemah tak berdaya, Lebih dari 500 Masjid dan Mushalla rata dengan tanah, kini ibadah saudara kita harus bertebaran dimana-mana , masih banyak warga yang tak bisa melaksanakan shalat dengan nyaman. Lokasi masjid dan mushalla sudah tak dapat dipake kembali , semua rusak parah dan bahkan sudh rata dengan tanah.<br /><br />Terpaksa mereka shalat di luar, tempat terbuka , bahkan di atas reruntuhan bangunan rumah sekalipun. Kini tak kurang dari 300 Masjid dan Mushalla yang dilaporkan rusak, dan lebih dari 70 masjid yang hancur rata dengan tanah karena gempa. semua masjid ini tersebar di 3 kabupaten (lombok utara, lombok barat dan lombok timur).",
"fotoEvent": "event_5e4b8d72e2d37_202002181408.jpg",
"waktuEvent": "09:00 s.d Selesai",
"statusEvent": "t",
"createBy": "",
"createTime": "2020-02-18 14:08:34",
"updateBy": "",
"updateTime": "0000-00-00 00:00:00"
}
]
}
''';
Event event = eventFromJson(responseString);
for (int i = 0; i < event.data.length; i++) {
var createTime = DateTime(event.data[i].createTime.year,
event.data[i].createTime.month, event.data[i].createTime.day);
var original = mapFetch[createTime];
if (original == null) {
print("null");
mapFetch[createTime] = [event.data[i].tanggalEvent];
} else {
print(event.data[i].tanggalEvent);
mapFetch[createTime] = List.from(original)
..addAll([event.data[i].tanggalEvent]);
}
}
return mapFetch;
}
void _onDaySelected(DateTime day, List events) {
print('CALLBACK: _onDaySelected');
setState(() {
_selectedEvents = events;
});
}
@override
void initState() {
final _selectedDay = DateTime.now();
_selectedEvents = [];
_calendarController = CalendarController();
_animationController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 400),
);
_animationController.forward();
WidgetsBinding.instance.addPostFrameCallback((_) {
getTask1().then((val) => setState(() {
_events = val;
}));
//print( ' ${_events.toString()} ');
});
super.initState();
}
@override
void dispose() {
_calendarController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_buildTableCalendarWithBuilders(),
const SizedBox(height: 8.0),
const SizedBox(height: 8.0),
Expanded(child: _buildEventList()),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
Widget _buildTableCalendarWithBuilders() {
return TableCalendar(
//locale: 'pl_PL',
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,
);
}
void _onVisibleDaysChanged(
DateTime first, DateTime last, CalendarFormat format) {
print('CALLBACK: _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(),
);
}
}
class EventModel {
String kodeEvent;
DateTime tanggalEvent;
String judulEvent;
String lokasiEvent;
String isiEvent;
String fotoEvent;
String waktuEvent;
String statusEvent;
String createBy;
DateTime createTime;
String updateBy;
String updateTime;
EventModel({
this.kodeEvent,
this.tanggalEvent,
this.judulEvent,
this.lokasiEvent,
this.isiEvent,
this.fotoEvent,
this.waktuEvent,
this.statusEvent,
this.createBy,
this.createTime,
this.updateBy,
this.updateTime,
});
factory EventModel.fromJson(Map<String, dynamic> json) => EventModel(
kodeEvent: json["kodeEvent"],
tanggalEvent: DateTime.parse(json["tanggalEvent"]),
judulEvent: json["judulEvent"],
lokasiEvent: json["lokasiEvent"],
isiEvent: json["isiEvent"],
fotoEvent: json["fotoEvent"],
waktuEvent: json["waktuEvent"],
statusEvent: json["statusEvent"],
createBy: json["createBy"],
createTime: DateTime.parse(json["createTime"]),
updateBy: json["updateBy"],
updateTime: json["updateTime"],
);
}
关于Flutter 表日历 : Showing Event from API to Table Calendar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276303/
我正在尝试从flutter应用程序构建apk,但出现此错误: Note: /mnt/Software/Linux/Flutter/flutter/.pub-cache/hosted/pub.dartl
我有一个名为 X 的较大应用程序,还有另一个名为 Y 的较小应用程序。他们现在彼此分开,并且工作正常。我想将应用程序 Y 集成到 X 中。我想将 Y 的代码放入 X 项目中,但它们应该有不同的 Mai
在android Studio中选择Create New Flutter Project,出现如下4个选项。 Flutter 应用程序 Flutter 插件 Flutter 包 flutter 模块
我看到我的 flutter 项目生成了一个文件 ios/Flutter/Flutter.podspec ,这个文件有什么用? 如果它与生成的 Flutter.framework 有关? 我应该将它包含
我尝试过的 在包含flutter SDK的位置添加/编辑.bash_profile.rtf文件。 导出PATH = / Users / temur / Documents / Projects / F
Flutter 日志会打印数千个详细/垃圾邮件日志。 我正在尝试调试一个复杂的应用程序,但是打印太冗长了,以至于我很难找到我自己打印的东西。 有没有办法禁用详细? 就像是: Logger.level.
在flutter 1.22更新之后,我在Lineargradient colors属性中遇到错误,这给我一个错误,即未定义名称colors参数。.在Android中更新flutter和flutter插
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
在下面的代码 widget.hintText 中给出错误,我试图将日期选择器作为单独的组件,并在从其他文件调用它时动态传递提示文本值。 import 'package:date_field/date_
Flutter 1.0 发布后,我正在按照步骤搭建 Flutter 开发环境。 在步骤中(如所附屏幕截图所示),它说要更新 $PATH 两次,一次使用 flutter 工具的路径 export PAT
我有一个用 flutter 编写的移动应用程序,我想将其转换为 flutter_web 应用程序(集成 flutter_web 尚不可用)。我目前遇到包裹问题。 我已按照本网站中列出的说明进行操作 h
如何向我的 Flutter 路由添加自定义转换?这是我目前的路线结构。 class MyApp extends StatelessWidget { // This widget is the
我正在尝试通过 URL 在 webview 中显示网页。我试过 flutter_webview_plugin 插件,但是当我在浏览器上运行项目时它不起作用。 在 flutter web applica
我正在使用 animatedContainer 在按下按钮时显示 listView.builder()。这是一个要显示的简单子(monad)列表,但问题是我不知道 ListView 构建器的高度会传递
我目前正在我的应用程序中制作渐变背景动画......我正在使用 lottie 动画的帮助下这样做!我试图将它封装在一个容器中并成功地做到了。但是有一个问题,尽管我将高度更改为大于 2000 的东西,但
美好的一天! 我无法弄清楚如何使用 google 标签管理器设置 flutter。我找到了 this package包括标签管理器 api。但是我不知道如何正确配置它。 (在网络上我只需要复制粘贴一个
我的购物车模型如下 class Cart { String description; double unitCost; double amount; int quantity; S
在 Flutter 应用程序中,我想为在线托管的资源(图像、视频等)实现缓存。 我希望它能在原生平台 (Android/iOS)(例如使用文件系统)和网络(例如使用 IndexedDB)上运行。 Fl
我写了一个页面,在顶部一切都很好,应该是这样。在底部我有一个事件的历史。我的容器的宽度是自动确定的(取决于屏幕的宽度),而高度 - 不,在不同的设备上有不同的高度(底部的缩进是不同的)。是否可以自动确
我正在处理一个页面,其中有一些字段,例如 textfield 和 slider。在页面的末尾必须有一个用于进行下一步的按钮,该按钮被包裹在 Align 中以在页面之间具有固定位置。 另一方面,resi
我是一名优秀的程序员,十分优秀!