Flutter 可选择在小部件树中包含/排除父小部件

atr*_*eon 6 flutter

我有这个小部件树

return Container(
  color: Colors.blue,
  child: Container(
    child: Text("Child"),
  ),
);
Run Code Online (Sandbox Code Playgroud)

有没有办法从树中删除父小部件或有条件地包含它?

例如,如果 includeBlueContainer 等状态变量为 false,我不想渲染蓝色容器(但显示其他所有内容)。

atr*_*eon 10

我无法实现可选地包含可重用小部件,但我一直在使用这种模式,它确实实现了我想要实现的目标。我没有对此进行太多思考,但我仍然觉得某个地方有更好的解决方案。

class MyContainer extends StatelessWidget {
  final Widget child;
  final bool isIncluded;
  MyContainer({this.child, this.isIncluded = true});

  Widget build(BuildContext context) {
    if (!isIncluded) return child;

    return Container(
      color: Colors.blue,
      child: child,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


omn*_*sia 9

编辑:我用这个制作了一个包:https://pub.dev/packages/conditional_parent_widget

你可以这样使用:

import 'package:flutter/widgets.dart';
import 'package:conditional_parent_widget/conditional_parent_widget.dart';

// ...

return ConditionalParentWidget(
  condition: includeBlueContainer,
  child: Text("Child"),
  parentBuilder: (Widget child) => Container(
    color: Colors.blue,
    child: child,
  ),
);
Run Code Online (Sandbox Code Playgroud)

在内部它只是:

import 'package:flutter/widgets.dart';

class ConditionalParentWidget extends StatelessWidget {
  const ConditionalParentWidget({
    Key? key,
    required this.condition,
    required this.child,
    required this.parentBuilder,
  }) : super(key: key);

  final Widget child;
  final bool condition;
  final Widget Function(Widget child) parentBuilder;

  @override
  Widget build(BuildContext context) {
    return condition ? this.parentBuilder(this.child) : this.child;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我现在也更新了软件包 (2认同)