Flutter: дочерние виджеты (которые передаются как аргументы конструктора) родителю, отправляя события родительскому виджету? - PullRequest
0 голосов
/ 30 марта 2019

Итак, у меня есть ChipSet виджет, которому передается список MyChip виджетов в конструкторе.

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:hello_world/widgets/chip.dart';

class ChipSet extends StatefulWidget {

  final List<MyChip> chips;

  ChipSet({
    Key key,
    @required this.chips,
  }) : super(key: key);

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

class _ChipSetState extends State<ChipSet> {
  @override
  Widget build(BuildContext context) {
    return Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: widget.chips
    );
  }
}

Код виджета чипа следующий:

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

class MyChip extends StatelessWidget {
  final bool active;
  final Color color;
  final IconData icon;
  final String text;
  final EdgeInsets padding;

  MyChip({
    Key key,
    @required this.color,
    @required this.icon,
    @required this.text,
    this.active = false,
    this.padding = const EdgeInsets.all(0)
  }) : super(key: key);

  void _onTap() {
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: _onTap,
        child: Container(
            padding: const EdgeInsets.all(4),
            margin: const EdgeInsets.only(right: 6),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.all(Radius.circular(12)),
                color: active ? color : Colors.white),
            child: Row(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Icon( icon, size: 15),
                Padding(
                  padding: padding,
                  child: Text(text,
                      style: TextStyle(fontSize: 12, color: Colors.black)),
                )
              ],
            )));
  }
}

Я хочу следующее: для виджета ChipSet должен быть только один активный MyChip в любой момент времени.Щелчок на виджете чипа сделает этот MyChip активным и, следовательно, сделает все остальные MyChip в этом ChipSet неактивными.

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как получить доступметод на моем родительском виджете ChipSet из моего виджета чипа, когда, например, MyChip касается метода _onTap.Кто-нибудь знает элегантное решение этой проблемы управления государством?Кроме того, я хотел бы, чтобы дочерний виджет MyChip передавал его значение, то есть когда MyChip установлен в активное состояние, а остальные в неактивное, родительский элемент получает значение активного MyChip.(например, value было бы свойством MyChip)

Моя главная проблема заключается в том, что этот ChipSet получает эти чипы в качестве аргументов конструктора.

Мне известен шаблон, в котором родительский объект передает его обратный вызов дочернему элементу (конструктору дочерних виджетов.).Но в этом случае использования я не вижу, как этот шаблон применим, поскольку виджеты передаются в ChipSet.

. Я был бы очень признателен за помощь в этом.С наилучшими пожеланиями.

...