问题描述
我正在处理日历并将用户事件添加到相应的日期和时间。我能够添加事件名称并将它们映射到 DateTime,但是我在用事件映射时间时遇到了问题。请帮我。我能够获取 _setTime 上的时间,但如何将其与 Map
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:table_calendar/table_calendar.dart';
import 'package:date_format/date_format.dart';
class DynamicEvent extends StatefulWidget {
@override
_DynamicEventState createState() => _DynamicEventState();
}
class _DynamicEventState extends State<DynamicEvent> {
CalendarController _controller;
Map<DateTime,List<dynamic>> _events;
List<dynamic> _selectedEvents;
TextEditingController _eventController;
SharedPreferences prefs;
@override
void initState() {
super.initState();
_controller = CalendarController();
_eventController = TextEditingController();
_events = {};
_selectedEvents = [];
prefsData();
}
String _setTime,_hour,_minute,_time;
TimeOfDay selectedTime = TimeOfDay(hour: 00,minute: 00);
TextEditingController _timeController = TextEditingController();
Future<Null> _selectTime(BuildContext context) async {
final TimeOfDay picked = await showTimePicker(
context: context,initialTime: selectedTime,);
if (picked != null)
setState(() {
selectedTime = picked;
_hour = selectedTime.hour.toString();
_minute = selectedTime.minute.toString();
_time = _hour + ' : ' + _minute;
_timeController.text = _time;
_timeController.text = formatDate(
DateTime(2019,08,1,selectedTime.hour,selectedTime.minute),[hh,':',nn," ",am]).toString();
});
}
prefsData() async {
prefs = await SharedPreferences.getInstance();
setState(() {
_events = Map<DateTime,List<dynamic>>.from(
decodeMap(json.decode(prefs.getString("events") ?? "{}")));
});
}
Map<String,dynamic> encodeMap(Map<DateTime,dynamic> map) {
Map<String,dynamic> newMap = {};
map.forEach((key,value) {
newMap[key.toString()] = map[key];
});
return newMap;
}
Map<DateTime,dynamic> decodeMap(Map<String,dynamic> map) {
Map<DateTime,value) {
newMap[DateTime.parse(key)] = map[key];
});
return newMap;
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey[100],appBar: AppBar(
automaticallyImplyLeading: false,backgroundColor: Colors.black,title: Text('Flutter Dynamic Event Calendar'),),body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
TableCalendar(
events: _events,initialCalendarFormat: CalendarFormat.week,calendarStyle: CalendarStyle(
canEventMarkersOverflow: true,todayColor: Colors.orange,selectedColor: Theme.of(context).primaryColor,todayStyle: TextStyle(
fontWeight: FontWeight.bold,fontSize: 18.0,color: Colors.white)),headerStyle: HeaderStyle(
centerHeaderTitle: true,formatButtonDecoration: BoxDecoration(
color: Colors.orange,borderRadius: BorderRadius.circular(20.0),formatButtonTextStyle: TextStyle(color: Colors.white),formatButtonShowsNext: false,startingDayOfWeek: StartingDayOfWeek.monday,onDaySelected: (date,events,holidays) {
setState(() {
_selectedEvents = events;
});
},builders: CalendarBuilders(
selectedDayBuilder: (context,date,events) => Container(
margin: const EdgeInsets.all(4.0),alignment: Alignment.center,decoration: BoxDecoration(
color: Theme.of(context).primaryColor,borderRadius: BorderRadius.circular(10.0)),child: Text(
date.day.toString(),style: TextStyle(color: Colors.white),)),todayDayBuilder: (context,decoration: BoxDecoration(
color: Colors.orange,calendarController: _controller,..._selectedEvents.map((event) => Padding(
padding: const EdgeInsets.all(8.0),child: Container(
height: MediaQuery.of(context).size.height/20,width: MediaQuery.of(context).size.width/2,decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),color: Colors.white,border: Border.all(color: Colors.grey)
),child: Center(
child: Text(event,style: TextStyle(color: Colors.blue,fontWeight: FontWeight.bold,fontSize: 16),)
),],floatingActionButton: FloatingActionButton(
backgroundColor: Colors.black,child: Icon(Icons.add),onPressed: _showAddEventDialog(context),);
}
_showAddEventDialog(BuildContext context) async {
await showDialog(context: context,builder: (context) {
return AlertDialog(
title: Center(child: Text("Add Event")),content: Container(
width: 300,height: 200,child: ListView(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,children: [
Text("Event Name:"),TextField(controller: _eventController),SizedBox(height: 15),Text("Event Time:"),InkWell(
onTap: () {
_selectTime(context);
},child: Container(
width: 200,height: 50,decoration: BoxDecoration(color: Colors.grey[200]),child: TextFormField(
style: TextStyle(fontSize: 16),textAlign: TextAlign.center,onSaved: (String val) {
_setTime = val;
},enabled: false,keyboardType: TextInputType.text,controller: _timeController,decoration: InputDecoration(
disabledBorder:
UnderlineInputBorder(borderSide: BorderSide.none),contentPadding: EdgeInsets.all(5)),)
],actions: [
TextButton(
child: Text("Save",style: TextStyle(color: Colors.red,fontWeight: FontWeight.bold)
),onPressed: () {
if (_eventController.text.isEmpty) return;
setState(() {
if (_events[_calendarController.selectedDay] != null) {
_events[_calendarController.selectedDay]
.add(_eventController.text);
}
else {
_events[_calendarController.selectedDay] = [
_eventController.text
];
}
prefs.setString("events",json.encode(encodeMap(_events)));
print(_timeController.text.toString());
_eventController.clear();
Navigator.pop(context);
});
},)
],);
});
}
}
我创建了一个模型来映射日期与事件列表(事件名称和事件时间)。请帮助我映射和获取数据。
import 'dart:convert';
UserEvents userEventsFromJson(String str) => UserEvents.fromJson(json.decode(str));
String userEventsToJson(UserEvents data) => json.encode(data.toJson());
class UserEvents {
DateTime date;
List<Event> events;
UserEvents({
this.date,this.events,});
factory UserEvents.fromJson(Map<String,dynamic> json) => UserEvents(
date: json["date"],events: List<Event>.from(json["events"].map((x) => Event.fromJson(x))),);
Map<String,dynamic> toJson() => {
"date": date,"events": List<dynamic>.from(events.map((x) => x.toJson())),};
}
class Event {
String eventName,eventTime;
Event({
this.eventName,this.eventTime
});
factory Event.fromJson(Map<String,dynamic> json) => Event(
eventName: json["eventName"],eventTime: json["eventTime"]
);
Map<String,dynamic> toJson() => {
"eventName": eventName,"eventTime": eventTime
};
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)