【问题标题】:how to pass arguments dynamically?如何动态传递参数?
【发布时间】:2019-07-20 11:53:21
【问题描述】:

我正在尝试在标题旁边创建一个按钮,但不是在开头传递内容,而是在尝试动态执行它,因此我使用了构造函数,而不是在调用构造函数时获取传递的值我一直为空。那么如何使用构造函数或任何其他方式动态传递参数呢?这是我正在使用的类

class Header extends StatefulWidget {

String buttonTitle;
String title;

Header(String buttonTitle , String title) //the constructor I'm gonna 
call
{
this.buttonTitle = buttonTitle;
this.title = title;
}

@override
HeaderState createState() => HeaderState(buttonTitle , title);
}


class HeaderState extends State<Header> {
String buttonTitle;
String title;

HeaderState(String buttonTitle , String title)
{
this.buttonTitle = buttonTitle;
this.title = title;
}

@override
Widget build(BuildContext context) {
//some code
Text("$title", //the first parameter passed dynamically),

RaisedButton(
child: Text(
"$buttonTitle", //the second parameter
),
}


class FirstScreen extends StatefulWidget {
@override
FirstScreenState createState() => FirstScreenState();
}  


class FirstScreenState extends State<FirstScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
Header("OK", "Page1"),//constructor is called here 
);
}
}

【问题讨论】:

    标签: dynamic flutter dart widget


    【解决方案1】:

    我认为您想制作可重用的小部件,您犯了几个错误,因此您可以将其与下面的代码进行比较。下面是完整的工作代码。

    import 'package:flutter/material.dart';
    
    void main() => runApp(FirstScreen());
    
    class Header extends StatefulWidget {
      final String buttonTitle;
      final String title;
    
      Header({this.buttonTitle, this.title});
    
      @override
      HeaderState createState() => HeaderState();
    }
    
    class HeaderState extends State<Header> {
      String buttonTitle;
      String title;
    
      @override
      Widget build(BuildContext context) {
        return Row(children: [
          Text("${widget.title}"),
          RaisedButton(
            child: Text("${widget.buttonTitle}"),
            onPressed: () {},
          ),
        ]);
      }
    }
    
    class FirstScreen extends StatefulWidget {
      @override
      FirstScreenState createState() => FirstScreenState();
    }
    
    class FirstScreenState extends State<FirstScreen> {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Header(buttonTitle: "OK", title: "Page1"),
            ),
            body: Header(buttonTitle: "Reuse", title: "Reuse in body"),
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      你不能直接在 Scaffold 中调用你的 Header 类。您必须将其分配给 Scaffold 的某些属性,例如

      Scaffold(
      body: Header("OK", "Page1"),
      );
      

      你也可以尝试使用widget.variable_name代替美元符号来调用变量值。

      Text(widget.title,),
      
      RaisedButton(
      child: Text(
      widget.buttonTitle,
      ),
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 2018-08-15
        • 2013-06-04
        相关资源
        最近更新 更多