Во Flutter как повлиять на состояние родительского экрана?

Вот я хочу сделать. Когда в MenuScreen выбран checkboxListTile, кнопка навигации на родительском экране меняет состояние, чтобы переключить текст.

выбор из нескольких элементов, возврат всплывающей подсказки отсутствует.

нет функции async, 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'),),
            ],
        ));
    }
}

Во Flutter как повлиять на состояние родительского экрана?

0
0
1 023
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самый простой способ справиться с этим вариантом использования - передать функцию обратного вызова вашему дочернему виджету. Таким образом, вы можете сказать родителю, чтобы он перестроил, используя 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(() {
                     ...
                   });
                },

можешь дать более конкретный код? Я просто пробовал несколько раз с функцией обратного вызова, setState (), похоже, не работает должным образом

force-guidance 14.09.2018 08:54

Извините за беспокойство, я наконец понял.

force-guidance 14.09.2018 09:24

Я просто оставляю для этого полный код.

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'),
        ),
      ],
    ));
  }
}

Другие вопросы по теме