在Flutter中如何影响父屏状态?

问题描述 投票:0回答:2

这是我想做的。当MenuScreen的checkboxListTile被选中时,父屏幕导航按钮改变状态以切换一些文本。

多选,没有导航弹出返回。

没有异步功能,InheritedWidget似乎没有任何更新事件。

我从来没有找到全局变量onChange Listener,可能我应该知道。

import 'package:flutter/material.dart';

class SandBoxScreen extends StatefulWidget {
    @override
    SandBoxState createState() => SandBoxState();
}

class SandBoxState extends State<SandBoxScreen> with TickerProviderStateMixin {
    @override
    void initState() {
        super.initState();
    }
    bool isSelected = false;
    @override
    Widget build(BuildContext context) {
        String nextText = isSelected ? 'next' : 'plz select';
        return new Scaffold(
            appBar: AppBar(),
            body: new Container(
                child:Column(children: <Widget>[
                    _MenuSelection(),
                    Row(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: <Widget>[
                            RaisedButton(child:Text('prev')),
                            RaisedButton(child:Text(nextText)),
                        ],
                    )
                ],)
            )
        );
    }
}


class _MenuSelection extends StatefulWidget{
    @override
    _MenuState createState() => _MenuState();
}
class _MenuState extends State<_MenuSelection>{
    List<bool> selection = [false,false,false,false];
    @override
    Widget build(BuildContext context) {
        return Container(child:Column(
            children: <Widget>[
                CheckboxListTile(value: selection[0], onChanged: (a){setState(() { selection[0] = a; });} , title: Text('item1'),),
                CheckboxListTile(value: selection[1], onChanged: (a){setState(() { selection[1] = a; });} , title: Text('item2'),),
                CheckboxListTile(value: selection[2], onChanged: (a){setState(() { selection[2] = a; });} , title: Text('item3'),),
                CheckboxListTile(value: selection[3], onChanged: (a){setState(() { selection[3] = a; });} , title: Text('item4'),),
            ],
        ));
    }
}

enter image description here

dart flutter
2个回答
1
投票

处理此用例的最简单方法是将回调函数传递给子窗口小部件。这样你可以说父母用setState()重建

class _MenuSelection extends StatefulWidget {
  final Function onSelect;

  _MenuSelection(this.onSelect);
}

// child
CheckboxListTile(value: selection[0], onChanged: (a) {
    setState(() { 
      selection[0] = a;
      onSelect(0, a);
    });
} , title: Text('item1'),),

// SandBoxState         
Column(children: <Widget>[
                _MenuSelection((index, value) {
                   // rebuild SandBoxState
                   setState(() {
                     ...
                   });
                },

0
投票

我只是留下完整的代码。

import 'package:flutter/material.dart';

class SandBoxScreen extends StatefulWidget {
  @override
  SandBoxState createState() => SandBoxState();
}

class SandBoxState extends State<SandBoxScreen> with TickerProviderStateMixin {
  @override
  void initState() {
    super.initState();
  }

  bool isSelected = false;

  List<bool> selection = [false, false, false, false];
  @override
  Widget build(BuildContext context) {
    String nextText = isSelected ? 'next' : 'plz select';
    return new Scaffold(
        appBar: AppBar(),
        body: new Container(
            child: Column(
          children: <Widget>[
            _MenuSelection(selection,(index, value){
              setState(() {
                selection[index] = value;
                if(selection.contains(true)){
                  isSelected = true;
                }else{
                  isSelected = false;
                }
              });
            }),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                RaisedButton(child: Text('prev')),
                RaisedButton(child: Text(nextText)),
              ],
            )
          ],
        )));
  }
}

class _MenuSelection extends StatefulWidget {
  final Function onSelect;
  final List selection;
  _MenuSelection(this.selection, this.onSelect);

  @override
  _MenuState createState() => _MenuState();
}

class _MenuState extends State<_MenuSelection> {

  @override
  Widget build(BuildContext context) {
    return Container(
        child: Column(
      children: <Widget>[
        CheckboxListTile(
          value: widget.selection[0],
          onChanged: (a) {
            setState(() {
              widget.selection[0] = a;
              widget.onSelect(0,a);
            });
          },
          title: Text('item1'),
        ),
      ],
    ));
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.