将参数传递给initState

问题描述 投票:0回答:1

查看此代码 - 获取数据并显示在列表上的小部件:

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 - 返回所有事件。上面的代码加载我的事件,并在fetchEvents覆盖内调用initState以避免不必要的数据重新加载。

要获取所有事件,我定义了另一个类:

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();
          },
        )
    );
  }
}
dart flutter widget stateful
1个回答
2
投票

将此参数传递给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(

    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.