Flutter中如何在widget树中可选地包含/排除父级widget

5

我有这个小部件树

return Container(
  color: Colors.blue,
  child: Container(
    child: Text("Child"),
  ),
);

有没有一种方法可以从树中删除父小部件或有条件地包含它?

例如,如果像includeBlueContainer这样的状态变量为false,则不希望呈现蓝色容器(但显示其他所有内容)。

2个回答

9

我无法实现可选包含可重用小部件,但我一直在使用这种模式来实现我想要实现的目标。我还没有认真考虑过这个问题,但我仍然觉得有更好的解决方案。

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

7

编辑:我把这个东西封装成了一个包: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,
  ),
);

在内部,它只是:

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;
  }
}

1
如果您更新此软件包以允许开发人员有条件地使用Parent A与Parent B,那将是很好的。目前只能选择Parent A或不选。 - Shawn Ashton
1
我忘记了这个包,看看这里:https://github.com/ltOgt/ltogt_utils_flutter/blob/c0534dd7a3934a746b6a0488e7b4e9b4f8490464/lib/src/widget/builder/conditional_parent_widget.dart - omnesia
2
我现在也更新了这个包。 - omnesia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接