加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dart – 如何将数据从子窗口小部件传递到其父窗口

发布时间:2020-12-14 14:55:53 所属栏目:百科 来源:网络整理
导读:我有下面的自定义小部件,它创建一个Switch并读取其状态(true / false) 然后我将这个添加到我的主应用程序小部件(父级),如何让父级知道交换机的值! import 'package:flutter/material.dart';class Switchy extends StatefulWidget{ Switchy({Key key}) : sup
我有下面的自定义小部件,它创建一个Switch并读取其状态(true / false)

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

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 pattern作为您的有状态小部件.见下文.

import 'package:flutter/material.dart';

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

  static MyStatefulWidgetState of(BuildContext context) {
    final MyStatefulWidgetState navigator =
        context.ancestorStateOfType(const TypeMatcher<MyStatefulWidgetState>());

    assert(() {
      if (navigator == null) {
        throw new FlutterError(
            'MyStatefulWidgetState operation requested with a context that does '
            'not include a MyStatefulWidget.');
      }
      return true;
    }());

    return navigator;
  }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读