导航到带有参数的类

时间:2019-08-19 14:25:02

标签: flutter dart

如何导航到其构造函数带有某些自变量的页面(类)。我显然不想传递任何参数。我只希望执行该类,以便显示页面。

我尝试提供伪参数,以便我的代码进行编译。但这是不对的。

代码:

class MyApp extends StatelessWidget {
  Widget build(ct) {
    return MaterialApp(
      theme: ThemeData(
        brightness: Brightness.light,
        accentColor: Colors.red,
        iconTheme: IconThemeData(color: Colors.pinkAccent),
      ),
      title: kAPP_NAME,
      home: Home(),
      routes: {
        Products.routeName: (context) => Products()
      },
    );
  }
}

产品类别


class Products extends StatelessWidget
{
  static const routeName = '/products';

  final List<String> products;


  Products(this.products);

... 
...

// widget building etc..
}

如您所见,该行:

   Products.routeName: (context) => Products()

自然不会编译->这是因为Products接受单个参数。

我该怎么办?

3 个答案:

答案 0 :(得分:0)

简短答案

更改了此内容:

Products(this.products); // this is called *positional* parameters

对此:

class MyApp extends StatelessWidget { 
  Widget build(ct) { 
    return MaterialApp( 
      theme: ThemeData( 
        brightness: Brightness.light, 
        accentColor: Colors.red, 
        iconTheme: IconThemeData(color: Colors.pinkAccent), 
      ), 
      title: 'kAPP_NAME', 
      home: Home(),
      routes: { 
        Products.routeName: (context) => Products() 
      }, 
    ); 
  } 
}

class Products extends StatelessWidget { 
  static const routeName = '/products';

  final List products;

  Products({this.products = const []}); // this is called named parameters with default value

}

Dart docs说:

  

尽管命名参数是一种可选参数,但是您可以使用@required对其进行注释,以表明该参数是强制性的-用户必须为该参数提供一个值。

长答案

A。默认

默认情况下,需要位置参数。

class Person(){
  String name;
  Person(this.name)
}

Person("John") // ok
Person() // error

默认情况下,“命名参数”是可选的。

class Person(){
  String name;
  Person({this.name})
}


Person(name: "John") // ok
Person("John") // error
Person() // ok

B。自定义

自定义位置参数为可选。

class Person(){
  String name;
  int age;
  Person(this.name, [this.age])
}

Person("John") // ok
Person("John", 40) // ok

需要的自定义命名参数。

class Person(){
  String name;
  int age;
  Person({this.name, @required this.age})
}


Person(name: "John", age: 20) // ok
Person(name: "John") // error
Person() // error

C。位置和命名组合

但是在颤抖中,我们必须清楚地了解位置组合 和命名参数。

下面的代码演示了Flutter Text Widget,的克隆

class Text(){
  String name;
  String fontFamily;
  bool bold;
  Text(this.name, {this.fontFamily, this.bold})
}

Text("Flutter") // ok
Text("Flutter", fontFamily: "Roboto") // ok
Text("Flutter", bold: true) // ok
Text(name: "Flutter", bold: true) // error
Text(bold: true) // error

答案 1 :(得分:0)

您可以将Products.class的参数设为可选。 更改此:

Product(this.products);

对此:

Product([this.product]);

现在,如果实例化此类而不为products传递对象,它将保留为null。 您还可以为以下产品提供默认值:

Product([this.products = []]);

现在,每次您实例化此类而不传递任何参数时,它都会是空列表,而不是null

希望这会有所帮助。

答案 2 :(得分:0)

在给出答案之前,我是否要感谢Kalpesh和Ejabu的回答? 因此,问题在于我们有一个页面(一个类),该页面具有带有参数的构造函数。无论它是否是命名构造函数,它都不重要。问题是,每当实例化或引用此类(在routers {}中)时,路由都希望给出参数。这很愚蠢,因为没有为该路由提供任何参数。

那答案是什么?

好吧,答案,请不要给我红色箭头,但是答案是这样的:

只需在类(或方法)中使用所需的参数创建一个函数。有时我们使用类参数传递值..那是一种选择。我们可以不带任何构造函数参数地保留类,而只需创建一个函数以接收所需的参数即可。