dart - 将参数传递给 initState

标签 dart flutter widget stateful

看看这段代码 - 用于获取数据并显示在列表中的小部件:

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 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();
          },
        )
    );
  }
}

但这是非常愚蠢的解决方案,因为代码几乎相同。所以我尝试传递 bool 值来指示要加载哪些事件,类似这样:

@override
  initState(){
    super.initState();
    events = fetchEvents(isMyEvents);
  }

isMyEvents 应该从 EventsFragment 构造函数中获取。但是,它在 initState 中不可访问。何正确传递它?我可以在 build override 中访问它,但不能在 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(

    );
  }
}

关于dart - 将参数传递给 initState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55021127/

相关文章:

flutter - 如何在 flutter 中为自定义绘制的圆圈提供阴影

flutter - 在启用空值安全的情况下,如何在 Iterable.firstWhere 中从 orElse 返回空值?

Flutter 可以选择在小部件树中包含/排除父小部件

Android - 从下载的资源中获取 Widget RemoteView setImageViewBitmap

dart - 在 null 上调用了 Flutter 方法 []

flutter - 文本字段焦点触发UI的重建

datatable - Flutter:有没有办法在 "fix size"中获取 DataColumn 的/"reduce size" "DataTable"?

php - 你如何处理慈善捐款?

Android:以编程方式在图库小部件中的图像之间制作动画

visual-studio-code - 编程 Dart 时如何在 VSCode 中为我的类型着色和添加样式