How to pass data from child widget to its parent

后端 未结 3 577
故里飘歌
故里飘歌 2020-12-02 10:29

I\'ve the below custom widget that make a Switch and reads its status (true/false)

Then I add this one to my main app widget (parent), how can I make th

3条回答
  •  [愿得一人]
    2020-12-02 11:09

    The first possibility is to pass a callback into your child, and the second is to use the of pattern for your stateful widget. See below.

    import 'package:flutter/material.dart';
    
    class MyStatefulWidget extends StatefulWidget {
      @override
      State createState() => new MyStatefulWidgetState();
    
      static MyStatefulWidgetState of(BuildContext context) {
        final MyStatefulWidgetState navigator =
            context.ancestorStateOfType(const TypeMatcher());
    
        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 {
      String _string = "Not set yet";
    
      set string(String value) => setState(() => _string = value);
    
      @override
      Widget build(BuildContext context) {
        return new Column(
          children: [
            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: [
            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(),
          ),
        );
    

    There is also the alternative of using an InheritedWidget instead of a StatefulWidget; this is particularly useful if you want your child widgets to rebuild if the parent widget's data changes and the parent isn't a direct parent. See the inherited widget documentation

提交回复
热议问题