首页 > 解决方案 > 如何将 build 方法中的变量传递给 Flutter 中的父状态?

问题描述

我有一个看起来像这样的状态,我_getDatainitState中调用方法

class _DataPageState extends State<DataPage> {
  @override
  void initState() {
    super.initState();
    _selectedEvents = ValueNotifier(_getData(value!));
  }

  @override
  void dispose() {
    _selectedEvents.dispose();
    super.dispose();
  }

  List<dynamic> _getData(DateTime value) {
    //trying to access 'events' variable here
    return events[day] ?? [];
  }
 

我的构建方法看起来像这样

@override
  Widget build(BuildContext context) {
    final _source = toResults(data);
    //'events' variable I'm trying to pass
    final events = LinkedHashMap<DateTime, List<dynamic>>(
      equals: isSameDay,
      hashCode: getHashCode,
    )..addAll(_source);
  }

我正在尝试将events变量传递给_getData状态内的方法,以便能够在initState内运行它,是否有合适的方法来做到这一点?

如果没有,有没有办法将最终变量向上移动而不会出现“无法在初始化程序中访问实例成员”的问题?

标签: flutterdart

解决方案


你的build方法应该是“纯粹的”,这意味着它不应该有副作用,因为 Flutter 可以在需要重建小部件树时调用它(例如,如果出现键盘,如果更改为横向模式,因为父级重建等)。

在 Dart 中,如果你有一个变量在第一次使用之前会被初始化,但不能立即初始化,你可以使用late关键字。也许这样的事情会起作用:

class MyState extends State<MyWidget> {
  late LinkedHashMap<DateTime, List<dynamic>> _events;  // late means no initializer needed

  @override
  void initState() {
    super.initState();
    final _source = toResults(data);
    _events = LinkedHashMap<DateTime, List<dynamic>>(
      equals: isSameDay,
      hashCode: getHashCode,
    )..addAll(_source);
  }

  // other stuff
  
}

目前尚不完全清楚data来自哪里,但如果它可以从树的更高位置传入,您可以将其作为Widget类的属性并用于widget.data在内部安全地读取它initState()


推荐阅读