Flutter-在单击子按钮时更新parant小部件类UI

时间:2019-12-13 11:40:58

标签: flutter flutter-layout

enter image description here

我有这种情况

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。 这不起作用。

感谢您的帮助。

3 个答案:

答案 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