Flutter:子小部件(作为构造函数参数传递给父部件),向父小部件发出事件?

时间:2019-03-29 21:00:54

标签: dart flutter flutter-layout

所以我有一个margin: -20px 0 0 -20px; 小部件,该小部件在构造函数中传递了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设置为active且其他设置为inactive时,父部件将获得激活的MyChip的值。 (例如MyChip将是value的属性)

我的主要问题是,这个MyChip传递了这些芯片作为构造函数参数。

我知道一种模式,其中父级将其回调传递给子级(子级小部件构造函数)。但是在这种用例中,将小部件传递到ChipSet时,我看不到该模式的适用性。

我非常感谢您的帮助。最好的问候。

0 个答案:

没有答案