无法使用静态访问访问实例成员“”
Instance member '' can't be accessed using static access
我正在尝试按照此 youtube tutorial 将事件插入 syncfusion flutter 日历,但我不想像他们那样使用提供程序。我试着这样写我的主要 add/edit 事件代码:
class EditEventsPage extends StatefulWidget {
final Events? event;
const EditEventsPage({Key? key, this.event}) : super(key: key);
@override
_EditEventsPageState createState() => _EditEventsPageState();
}
class _EditEventsPageState extends State<EditEventsPage> {
final _formKey = GlobalKey<FormState>();
final titleController = TextEditingController();
late DateTime fromDate;
late DateTime toDate;
@override
void initState() {
super.initState();
if (widget.event == null) {
fromDate = DateTime.now();
toDate = DateTime.now().add(Duration(hours: 4));
}
}
@override
void dispose() {
titleController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Color(0xFF1c3f77),
elevation: 0,
leading: CloseButton(),
actions: buildEditingActions(),
),
body: SingleChildScrollView(
padding: EdgeInsets.all(12),
child: Form(
key: _formKey,
child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
buildTitle(),
SizedBox(height: 25),
buildDateTime(),
])),
),
);
}
List<Widget> buildEditingActions() => [
ElevatedButton.icon(
style: ElevatedButton.styleFrom(
primary: Colors.transparent, shadowColor: Colors.transparent),
icon: Icon(Icons.done),
label: Text(
'Add',
style: TextStyle(color: Colors.white, fontSize: 15),
),
onPressed: saveEvent,
)
];
Widget buildTitle() => TextFormField(
style: TextStyle(fontSize: 15),
decoration:
InputDecoration(border: UnderlineInputBorder(), hintText: 'Title'),
onFieldSubmitted: (_) => saveEvent(),
validator: (title) =>
title != null && title.isEmpty ? 'Title cannot be empty' : null,
controller: titleController,
);
为了添加一个事件,代码是:
Future saveEvent() async {
final isValid = _formKey.currentState!.validate();
if (isValid) {
final event = Events(
title: titleController.text,
details: 'testing 1 2 3',
from: fromDate,
to: toDate,
isAllday: false,
);
InsertEvent.addEvent(event);
Navigator.of(context).pop();
}
}
InsertEventClass 代码:
class InsertEvent {
final List<Events> _events = [];
List<Events> get events => _events;
void addEvent(Events event) {
_events.add(event);
}
}
但是,它给我一个错误,“无法使用静态访问访问实例成员 'addEvent'”。有人可以解释为什么会发生这种情况以及如何解决它吗?
您不能从 class 访问方法,除非您有 class 的实例。如果你想访问它,你可以将方法设为静态。
class InsertEvent {
final List<Events> _events = [];
List<Events> get events => _events;
static void addEvent(Events event) {
_events.add(event);
}}
但这可能无法单独解决您的问题。如果要保留事件,则需要 class 的实例。
因此您需要在以下状态创建实例:
var insertEventInstance = InsertEvent();
这样您就不需要将方法设为静态,并且可以访问事件。
他们使用provider来保存实例,你可以直接保存在state中。
根据共享信息,我们检查了提到的问题“无法使用静态访问访问实例成员''”。在共享代码片段中,您在没有为 class 创建实例的情况下调用了该方法,因此出现了此错误。此外,我们还有一个 KB 文档,用于使用约会编辑器将约会添加到日历中。请从以下link.
中找到知识库
此外,我们还有一个知识库文档,用于使用 onTap 回调将约会添加到日历。
此外,我们还有一个知识库文档用于删除点击的约会。请从以下 link.
中查找文档
KB link: https://www.syncfusion.com/kb/11522/how-to-delete-an-appointment-in-the-flutter-calendar
我正在尝试按照此 youtube tutorial 将事件插入 syncfusion flutter 日历,但我不想像他们那样使用提供程序。我试着这样写我的主要 add/edit 事件代码:
class EditEventsPage extends StatefulWidget {
final Events? event;
const EditEventsPage({Key? key, this.event}) : super(key: key);
@override
_EditEventsPageState createState() => _EditEventsPageState();
}
class _EditEventsPageState extends State<EditEventsPage> {
final _formKey = GlobalKey<FormState>();
final titleController = TextEditingController();
late DateTime fromDate;
late DateTime toDate;
@override
void initState() {
super.initState();
if (widget.event == null) {
fromDate = DateTime.now();
toDate = DateTime.now().add(Duration(hours: 4));
}
}
@override
void dispose() {
titleController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Color(0xFF1c3f77),
elevation: 0,
leading: CloseButton(),
actions: buildEditingActions(),
),
body: SingleChildScrollView(
padding: EdgeInsets.all(12),
child: Form(
key: _formKey,
child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
buildTitle(),
SizedBox(height: 25),
buildDateTime(),
])),
),
);
}
List<Widget> buildEditingActions() => [
ElevatedButton.icon(
style: ElevatedButton.styleFrom(
primary: Colors.transparent, shadowColor: Colors.transparent),
icon: Icon(Icons.done),
label: Text(
'Add',
style: TextStyle(color: Colors.white, fontSize: 15),
),
onPressed: saveEvent,
)
];
Widget buildTitle() => TextFormField(
style: TextStyle(fontSize: 15),
decoration:
InputDecoration(border: UnderlineInputBorder(), hintText: 'Title'),
onFieldSubmitted: (_) => saveEvent(),
validator: (title) =>
title != null && title.isEmpty ? 'Title cannot be empty' : null,
controller: titleController,
);
为了添加一个事件,代码是:
Future saveEvent() async {
final isValid = _formKey.currentState!.validate();
if (isValid) {
final event = Events(
title: titleController.text,
details: 'testing 1 2 3',
from: fromDate,
to: toDate,
isAllday: false,
);
InsertEvent.addEvent(event);
Navigator.of(context).pop();
}
}
InsertEventClass 代码:
class InsertEvent {
final List<Events> _events = [];
List<Events> get events => _events;
void addEvent(Events event) {
_events.add(event);
}
}
但是,它给我一个错误,“无法使用静态访问访问实例成员 'addEvent'”。有人可以解释为什么会发生这种情况以及如何解决它吗?
您不能从 class 访问方法,除非您有 class 的实例。如果你想访问它,你可以将方法设为静态。
class InsertEvent {
final List<Events> _events = [];
List<Events> get events => _events;
static void addEvent(Events event) {
_events.add(event);
}}
但这可能无法单独解决您的问题。如果要保留事件,则需要 class 的实例。
因此您需要在以下状态创建实例:
var insertEventInstance = InsertEvent();
这样您就不需要将方法设为静态,并且可以访问事件。
他们使用provider来保存实例,你可以直接保存在state中。
根据共享信息,我们检查了提到的问题“无法使用静态访问访问实例成员''”。在共享代码片段中,您在没有为 class 创建实例的情况下调用了该方法,因此出现了此错误。此外,我们还有一个 KB 文档,用于使用约会编辑器将约会添加到日历中。请从以下link.
中找到知识库此外,我们还有一个知识库文档,用于使用 onTap 回调将约会添加到日历。
此外,我们还有一个知识库文档用于删除点击的约会。请从以下 link.
中查找文档KB link: https://www.syncfusion.com/kb/11522/how-to-delete-an-appointment-in-the-flutter-calendar