flutter - 如何将 build 方法中的变量传递给 Flutter 中的父状态?
问题描述
我有一个看起来像这样的状态,我_getData
在initState中调用方法
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内运行它,是否有合适的方法来做到这一点?
如果没有,有没有办法将最终变量向上移动而不会出现“无法在初始化程序中访问实例成员”的问题?
解决方案
你的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()
推荐阅读
- android - Android WebView 有时不会在初始页面加载时发送请求标头
- c++ - 我可以在不使用原始指针的情况下避免在 std::initializer_list 初始化期间进行复制吗?
- azure - Azure 数据工厂和 SharePoint
- python - 金字塔“模型”也是金字塔“资源”吗?
- java - java.lang.NoSuchMethodError:Lcom/google/android/gms/common/zzc 类中没有静态方法 zza(Landroid/content/Context;)V;它的超类
- javascript - 如何将childNode添加到javascript中的元素
- google-cloud-platform - 具有 Bitbucket IP 白名单的 Google Source 外部存储库
- spring-mvc - 面向服务和三层架构在一起?
- azure - 我们可以在 VSTS 中为 Maven 构建任务使用多个目标吗
- android - 清单合并失败,minSdkVersion 1 不能小于库中声明的版本 4