Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 将参数传递给initState_Dart_Flutter_Widget_Stateful - Fatal编程技术网

Dart 将参数传递给initState

Dart 将参数传递给initState,dart,flutter,widget,stateful,Dart,Flutter,Widget,Stateful,查看此代码小部件以获取数据并显示在列表中: class _MyEventsFragmentState extends State <MyEventsFragment>{ var events; @override initState(){ super.initState(); events = fetchEvents(true); } @override Widget build(BuildContext context) { r

查看此代码小部件以获取数据并显示在列表中:

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();
          },
        )
    );
  }
}
但这是一个非常愚蠢的解决方案,因为代码几乎是一样的。因此,我尝试传递布尔值以指示要加载的事件,类似于:

@override
  initState(){
    super.initState();
    events = fetchEvents(isMyEvents);
  }
isMyEvents
应该从
EventsFragment
构造函数获取。但是,它在
initState
中不可访问。如何正确地通过它?我可以在
build
override中访问它,但不能在
initState
中访问它。如何正确地传递它,并确保每次创建小部件实例时都会刷新它

[编辑]

这就是我解决问题的方法(看起来不错):

class events片段扩展StatefulWidget{
constEventsFragment({Key-Key,this.isMyEvent}):super(Key:Key);
最后一次会议;
@凌驾
_EventsFragmentState createState()=>new_EventsFragmentState();
}
类_EventsFragmentState扩展状态{
var事件;
@凌驾
initState(){
super.initState();
events=fetchEvents(widget.isMyEvent);
}
@凌驾
void didUpdateWidget(EventsFragment oldWidget){
if(oldWidget.isMyEvent!=widget.isMyEvent)
events=fetchEvents(widget.isMyEvent);
super.didUpdateWidget(oldWidget);
}
@凌驾
小部件构建(构建上下文){
返回新中心(
孩子:未来建设者(
未来:活动,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.done){
if(snapshot.hasError){
注销(上下文,Strings.msg\u会话\u已过期);
返回循环ProgressIndicator();
}
返回新容器(颜色:Colors.white,
子级:新建ListControl().build(快照));
}
返回循环ProgressIndicator();
},
)
);
}
}

将该参数传递给
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 Foo扩展StatefulWidget{
const Foo({Key Key,this.isMyEvent}):super(Key:Key);
最后一次会议;
@凌驾
_FooState createState()=>\u FooState();
}
类_FooState扩展了状态{
@凌驾
void initState(){
super.initState();
打印(widget.isMyEvent);
}
@凌驾
小部件构建(构建上下文){
返回容器(
);
}
}

将您的参数保持为
final
字段,在
事件片段中
它将无法从状态访问是的,请参阅
状态#widget
属性
initState()
仅被调用一次,因此如果我第一次将isMyEvent传递为true,第二次传递为false,我的数据将不会被刷新。如何从我的小部件外部强制重置状态?我的意思是颤振缓存我的小部件。因此,如果我想再次显示它,使用已更改的
isMyEvent
值,静态数据将使用先前的
isMyEvent
值刷新。使用
diupdatewidget
如何使用它?我添加了
didUpdateWidget(小部件)
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();
          },
        )
    );
  }
}
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(

    );
  }
}