我有这种情况
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Hello"),
),
body: Container(
child: ChildWidget(
listControl: this.sentToScreenBuildJson,
notifyParent: refresh,
),
),
);
}
这是我的父代构建方法,在其中我向ChildWidget添加了另一个statfulscreen,并传递了json和刷新功能
每个json子项都能绘制UI 然后单击按钮,我就可以获取回调以刷新方法。
refresh() {
print("I get refreshed from child");
setState(() {
print("I get refreshed from child in setState");
this.sentToScreenBuildJson = this.newJson;
});
}
在按钮上单击都可以执行打印,但是UI不会按照newJson进行更新。 就像我期望的那样,作为setState运行,父级必须通过更新的json调用build。 这不起作用。
感谢您的帮助。
答案 0 :(得分:0)
在点击子按钮时更新parant小部件类UI
这是flutter中的一个常见用例,而flutter在InheritedWidget类中内置了这种用途。您可以直接将其用于您的目的,也可以使用一些现成的打包解决方案,该解决方案在Provider之类的幕后使用InheritedWidget
。
答案 1 :(得分:0)
当您要将数据从子级传递给父级时,应在父级使用NotificationListener
并从子级分发Notification
。
Notification
类的实例将具有您可以使用NotificationListener
在Parent中使用的数据。
几乎所有的Flutter Widget都使用此技术,例如,当用户到达最后一个标签并且仍尝试滑动时,标签控制器会收到OverscrollNotification
。
以下是可用于了解如何在代码中使用NotificationListener
的演示。
import 'package:flutter/material.dart';
void main() => runApp(ParentWidget());
class ParentWidget extends StatefulWidget {
ParentWidget({Key key}) : super(key: key);
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
String _text = 'You have not pressed the button yet';
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: NotificationListener<IntegerNotification>(
onNotification: (IntegerNotification notification) {
setState(() {
print(notification);
_text = 'You have pressed button ${notification.value} times';
});
return true;
},
child: Column(
children: <Widget>[
Text(_text),
ChildWidget(),
],
)
),
),
);
}
}
class ChildWidget extends StatefulWidget {
const ChildWidget({Key key}) : super(key: key);
@override
_ChildWidgetState createState() => _ChildWidgetState();
}
class _ChildWidgetState extends State<ChildWidget> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return RaisedButton(onPressed: (){
IntegerNotification(++_counter).dispatch(context);
},child: Text('Increment counter'),);
}
}
@immutable
class IntegerNotification extends Notification{
final int value;
const IntegerNotification(this.value);
String toString(){
return value.toString();
}
}
答案 2 :(得分:0)
@Darish答案的替代方法,您可以在.container {
width: 1px;
min-width: 100%;
}
table {
display: block;
width: 100%;
overflow-x: auto;
}
中声明一个静态变量,在class 1
中访问该静态变量,然后在class 2
中更新该变量的状态。
例如:
class 2