gpt4 book ai didi

dart - 在类外访问类属性

转载 作者:IT王子 更新时间:2023-10-29 07:06:29 25 4
gpt4 key购买 nike

在flutter中从类的外部改变一个类的属性有哪些方法?


这是用 dart 为 Flutter 编写的 BackDrop 布局代码,我想从类 FrontPanel 中关闭前面板(并且该属性用于另一个类,如您所见的 BackPanel 类)。

我已尝试使用 GlobalKey 和 Setter 方法来更改该属性,但我做不到。

我该怎么做?

问候。

import 'package:flutter/material.dart';

import 'backdrop.dart';

class SimpleExample extends StatelessWidget {
@override
Widget build(BuildContext context) =>
Scaffold(body: SafeArea(child: Panels()));
}

class Panels extends StatelessWidget {
final frontPanelVisible = ValueNotifier<bool>(false);

@override
Widget build(BuildContext context) {
return Backdrop(
frontLayer: FrontPanel(),
backLayer: BackPanel(
frontPanelOpen: frontPanelVisible,
),
frontHeader: FrontPanelTitle(),
panelVisible: frontPanelVisible,
frontPanelOpenHeight: 40.0,
frontHeaderHeight: 48.0,
frontHeaderVisibleClosed: true,
);
}
}

class FrontPanelTitle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: 16.0, left: 16.0),
child: Text(
'Tap Me',
style: Theme.of(context).textTheme.subhead,
),
);
}
}

class FrontPanel extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Theme.of(context).cardColor,
child: Center(child: Text('Hello world')));
}
}

class BackPanel extends StatefulWidget {
BackPanel({@required this.frontPanelOpen});
final ValueNotifier<bool> frontPanelOpen;

@override
createState() => _BackPanelState();
}

class _BackPanelState extends State<BackPanel> {
bool panelOpen;

@override
initState() {
super.initState();
panelOpen = widget.frontPanelOpen.value;
widget.frontPanelOpen.addListener(_subscribeToValueNotifier);
}

void _subscribeToValueNotifier() =>
setState(() => panelOpen = widget.frontPanelOpen.value);

/// Required for resubscribing when hot reload occurs
@override
void didUpdateWidget(BackPanel oldWidget) {
super.didUpdateWidget(oldWidget);
oldWidget.frontPanelOpen.removeListener(_subscribeToValueNotifier);
widget.frontPanelOpen.addListener(_subscribeToValueNotifier);
}

@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Center(
child: Padding(
padding: const EdgeInsets.only(
top: 10.0,
),
child: Text('Front panel is ${panelOpen ? "open" : "closed"}'),
)),
Center(
child: RaisedButton(
child: Text('Tap Me'),
onPressed: () {
widget.frontPanelOpen.value = true;
},
)),
// will not be seen; covered by front panel
Center(child: Text('Bottom of Panel')),
]);
}
}

最佳答案

居然找到了答案。

你可以通过制作一个动画 Controller 并将 Controller 传递给 FrontPages statefulwidget 然后在 StateClass 中通过 widget..(value: newValue) 使用它来做到这一点

关于dart - 在类外访问类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51637871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com