将参数传递给 initState
Pass parameter to initState
查看此代码 - 用于获取数据并显示在列表中的小部件:
class _MyEventsFragmentState extends State <MyEventsFragment>{
var events;
@override
initState(){
super.initState();
events = fetchEvents(true);
}
@override
Widget build(BuildContext context) {
return new Center(
child: FutureBuilder<EventsResponse>(
future: events,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
helpers.logout(context, Strings.msg_session_expired);
return CircularProgressIndicator();
}
return new Container(color: Colors.white,
child: new ListControl().build(snapshot));
}
return CircularProgressIndicator();
},
)
);
}
}
fetchEvent
方法有参数指示我需要获取哪些事件。如果设置为 true,- 我的事件,如果设置为 false - 返回所有事件。上面的代码加载了我的事件,并在 initState
覆盖中调用了 fetchEvents
以避免不必要的数据重新加载。
为了获取所有事件,我定义了另一个 class:
class EventsFragment extends StatefulWidget {
@override
_EventsFragmentState createState() => new _EventsFragmentState();
}
class _EventsFragmentState extends State <EventsFragment>{
var events;
@override
initState(){
super.initState();
events = fetchEvents(false);
}
@override
Widget build(BuildContext context) {
return new Center(
child: FutureBuilder<EventsResponse>(
future: events,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
helpers.logout(context, Strings.msg_session_expired);
return CircularProgressIndicator();
}
return new Container(color: Colors.white,
child: new ListControl().build(snapshot));
}
return CircularProgressIndicator();
},
)
);
}
}
但这是非常愚蠢的解决方案,因为代码几乎相同。所以我尝试传递布尔值来指示要加载哪些事件,例如:
@override
initState(){
super.initState();
events = fetchEvents(isMyEvents);
}
isMyEvents
应该从 EventsFragment
构造函数中获取。但是,initState
内无法访问它。何正确传递它?我可以在 build
覆盖内访问它,但不能在 initState
内访问它。如何正确传递它并确保每次创建小部件实例时都会刷新它?
[编辑]
这就是我解决问题的方法(似乎没问题):
class EventsFragment extends StatefulWidget {
const EventsFragment({Key key, this.isMyEvent}) : super(key: key);
final bool isMyEvent;
@override
_EventsFragmentState createState() => new _EventsFragmentState();
}
class _EventsFragmentState extends State <EventsFragment>{
var events;
@override
initState(){
super.initState();
events = fetchEvents(widget.isMyEvent);
}
@override
void didUpdateWidget(EventsFragment oldWidget) {
if(oldWidget.isMyEvent != widget.isMyEvent)
events = fetchEvents(widget.isMyEvent);
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return new Center(
child: FutureBuilder<EventsResponse>(
future: events,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
helpers.logout(context, Strings.msg_session_expired);
return CircularProgressIndicator();
}
return new Container(color: Colors.white,
child: new ListControl().build(snapshot));
}
return CircularProgressIndicator();
},
)
);
}
}
将此类参数传递给 StatefulWidget
子类,并改用该字段
class Foo extends StatefulWidget {
const Foo({Key key, this.isMyEvent}) : super(key: key);
final bool isMyEvent;
@override
_FooState createState() => _FooState();
}
class _FooState extends State<Foo> {
@override
void initState() {
super.initState();
print(widget.isMyEvent);
}
@override
Widget build(BuildContext context) {
return Container(
);
}
}
查看此代码 - 用于获取数据并显示在列表中的小部件:
class _MyEventsFragmentState extends State <MyEventsFragment>{
var events;
@override
initState(){
super.initState();
events = fetchEvents(true);
}
@override
Widget build(BuildContext context) {
return new Center(
child: FutureBuilder<EventsResponse>(
future: events,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
helpers.logout(context, Strings.msg_session_expired);
return CircularProgressIndicator();
}
return new Container(color: Colors.white,
child: new ListControl().build(snapshot));
}
return CircularProgressIndicator();
},
)
);
}
}
fetchEvent
方法有参数指示我需要获取哪些事件。如果设置为 true,- 我的事件,如果设置为 false - 返回所有事件。上面的代码加载了我的事件,并在 initState
覆盖中调用了 fetchEvents
以避免不必要的数据重新加载。
为了获取所有事件,我定义了另一个 class:
class EventsFragment extends StatefulWidget {
@override
_EventsFragmentState createState() => new _EventsFragmentState();
}
class _EventsFragmentState extends State <EventsFragment>{
var events;
@override
initState(){
super.initState();
events = fetchEvents(false);
}
@override
Widget build(BuildContext context) {
return new Center(
child: FutureBuilder<EventsResponse>(
future: events,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
helpers.logout(context, Strings.msg_session_expired);
return CircularProgressIndicator();
}
return new Container(color: Colors.white,
child: new ListControl().build(snapshot));
}
return CircularProgressIndicator();
},
)
);
}
}
但这是非常愚蠢的解决方案,因为代码几乎相同。所以我尝试传递布尔值来指示要加载哪些事件,例如:
@override
initState(){
super.initState();
events = fetchEvents(isMyEvents);
}
isMyEvents
应该从 EventsFragment
构造函数中获取。但是,initState
内无法访问它。何正确传递它?我可以在 build
覆盖内访问它,但不能在 initState
内访问它。如何正确传递它并确保每次创建小部件实例时都会刷新它?
[编辑]
这就是我解决问题的方法(似乎没问题):
class EventsFragment extends StatefulWidget {
const EventsFragment({Key key, this.isMyEvent}) : super(key: key);
final bool isMyEvent;
@override
_EventsFragmentState createState() => new _EventsFragmentState();
}
class _EventsFragmentState extends State <EventsFragment>{
var events;
@override
initState(){
super.initState();
events = fetchEvents(widget.isMyEvent);
}
@override
void didUpdateWidget(EventsFragment oldWidget) {
if(oldWidget.isMyEvent != widget.isMyEvent)
events = fetchEvents(widget.isMyEvent);
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return new Center(
child: FutureBuilder<EventsResponse>(
future: events,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
helpers.logout(context, Strings.msg_session_expired);
return CircularProgressIndicator();
}
return new Container(color: Colors.white,
child: new ListControl().build(snapshot));
}
return CircularProgressIndicator();
},
)
);
}
}
将此类参数传递给 StatefulWidget
子类,并改用该字段
class Foo extends StatefulWidget {
const Foo({Key key, this.isMyEvent}) : super(key: key);
final bool isMyEvent;
@override
_FooState createState() => _FooState();
}
class _FooState extends State<Foo> {
@override
void initState() {
super.initState();
print(widget.isMyEvent);
}
@override
Widget build(BuildContext context) {
return Container(
);
}
}