我有下面的自定义小部件,它设置为Switch,并读取其状态(TRUE/FALSE)

然后我将这个添加到我的主应用程序小部件(父应用程序)中,如何让父应用程序知道switch 的值!

import 'package:flutter/material.dart';

class Switchy extends StatefulWidget{
  Switchy({Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => new _SwitchyState();
  }

class _SwitchyState extends State<Switchy> {
  var myvalue = true;

  void onchange(bool value) {
    setState(() {
      this.myvalue = value;      // I need the parent to receive this one!
      print('value is: $value');
    });
  }

  @override
  Widget build(BuildContext context) {
    return             
      new Card(
      child: new Container(
        child: new Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            new Text("Enable/Disable the app in the background",
              textAlign: TextAlign.left,
              textDirection: TextDirection.ltr,),
            new Switch(value: myvalue, onChanged: (bool value) => onchange(value)),
          ],
        ),
      ),
    );
  }
}

main.dart(父)文件中,我从以下内容开始:

import 'widgets.dart';
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.deepOrange,
      ),
      home: new MyHomePage(title: 'My App settup'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  Widget e = new Switchy();
  //...

}

推荐答案

第一种可能性是将回调传递给您的子元素,第二种可能性是对您的有状态小部件使用of模式.请参见下面的内容.


import 'package:flutter/material.dart';

class MyStatefulWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new MyStatefulWidgetState();

  // note: updated as context.ancestorStateOfType is now deprecated
  static MyStatefulWidgetState of(BuildContext context) =>
    context.findAncestorStateOfType<MyStatefulWidgetState>();
}

class MyStatefulWidgetState extends State<MyStatefulWidget> {
  String _string = "Not set yet";

  set string(String value) => setState(() => _string = value);

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new Text(_string),
        new MyChildClass(callback: (val) => setState(() => _string = val))
      ],
    );
  }
}

typedef void StringCallback(String val);

class MyChildClass extends StatelessWidget {
  final StringCallback callback;

  MyChildClass({this.callback});

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new FlatButton(
          onPressed: () {
            callback("String from method 1");
          },
          child: new Text("Method 1"),
        ),
        new FlatButton(
          onPressed: () {
            MyStatefulWidget.of(context).string = "String from method 2";
          },
          child: new Text("Method 2"),
        )
      ],
    );
  }
}

void main() => runApp(
  new MaterialApp(
    builder: (context, child) => new SafeArea(child: new Material(color: Colors.white, child: child)),
    home: new MyStatefulWidget(),
  ),
);

还有一种替代方法是使用InheritedWidget而不是StatefulWidget;如果您希望在父窗口小部件的数据发生变化且父窗口小部件不是直接父窗口小部件时重建子窗口小部件,这一点尤其有用.看到inherited widget documentation了吗

Flutter相关问答推荐

Flutter 导致底部溢出

Android元数据为1.9.0,预期版本为1.7.1,如何解决flutter应用程序构建失败问题?

有没有一种正确的方法可以通过上下滑动在两个小部件(在我的情况下是应用程序栏)之间切换?

Flex ListView用于可滚动和响应的页面

Ffmpeg_kit_fltter:^6.0.3版权问题

无法在仿真器上运行Flutter 项目-文件名太长错误

Flutter:无法构建iOS应用程序-找不到PigeonParser.h文件

按一下按钮即可更新 fl_chart

Flutter 构建 Web 分段故障 - 无法启动事件处理程序线程

如何在 Flutter 中创建具有渐变背景色的自定义 Snackbar?

了解多Provider 和流

允许文本小部件在容器之间溢出

我想在文本结束后显示分隔线.它会在第一行、第二行或第三行结束

如何制作flutter showDialog、AlertDialog屏障 colored颜色 渐变

如何与 PostgreSQL 和外部网站交互 flutter apk?

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

Flutter HLS .m3u8 视频无法实时播放

Flutter RawMaterialButton 常量相对大小

在flutter web中重新加载页面时保留一些状态数据的有效方法是什么?

小部件库捕获的 Flutter 异常