繁体   English   中英

如何将小部件作为参数传递给函数

[英]How to pass the widget as a parameter to the function

我想传递一些小部件作为功能的参数,Flutter支持吗? 下面是我的代码。 是否应该将小部件作为参数传递给功能?

这是我想作为参数传递的小部件:

class FirstWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context){
        return Container(
            child: Text('i am the first'),
        );
    }
}
class SecondWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context){
        return Container(
            child: Text('i am the second'),

        );
    }
}

createWidget很重要:

class Main extends StatelessWidget {
    // maybe return a widget i wanna, maybe return a default widget.
    Widget _createWidget(widget){
        // do something to judge
        if(dosomething){
           return Container(
               child: Text('nothing'),
           );
        }
        // i wanna `widget()` at this postion. not when `_createWidget`
        return widget();
    }
    @override
    Widget build(BuildContext context){
        return Column(
            children: <Widget>[
                _createWidget(FirstWidget),
                _createWidget(SecondWidget),
            ],
        );
    }
}

您可以将Widget实例传递给函数,然后返回它:

@override
Widget build(BuildContext context){
  return Column(
    children: <Widget>[
        _createWidget(FirstWidget()),
        _createWidget(SecondWidget()),
    ],
  );
}

Widget _createWidget(Widget widget) {
  // ... other stuff...
  return widget;
}

或者,如果你想推迟建设FirstWidget()SecondWidget()直到你被称为 _createWidget()例如,如果你想_createWidget有条件地返回所构建的小部件),你可以使用匿名函数来创建一个形实转换

@override
Widget build(BuildContext context){
  return Column(
    children: <Widget>[
        _createWidget(() => FirstWidget()),
        _createWidget(() => SecondWidget()),
    ],
  );
}

Widget _createWidget(Widget Function() widgetBuilder) {
  // ... other stuff...
  return widgetBuilder();
}

您可以将任何东西传递给函数。 更改您的函数定义,如下所示:


    Widget _createWidget(Widget child){
        // do something to judge
        if(dosomething){
           return Container(
               child: Text('nothing'),
           );
        }
        // Notice that you just return the variable and not call it as a function.
        // return child(); <-- this one will result in an error
        return child; // <-- this is the right way
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM