Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make Function parameter optional in custom widget flutter

I try to create some custom widgets with some parameters in the constructor. This widget has some optional and required parameters.

how can make Function type parameter optional in my Widget.

class TextInputWithIcon extends StatefulWidget {   final String iconPath;   final String placeHolder;   final Function(bool) onFocusChange;   const TextInputWithIcon(       {Key key,       @required this.iconPath,       this.placeHolder = "",       this.onFocusChange})       : super(key: key);    @override   _TextInputWithIconState createState() => _TextInputWithIconState(); }  class _TextInputWithIconState extends State<TextInputWithIcon> { @override   Widget build(BuildContext context) {     return MY_WIDGET;    } } 
like image 984
Saman Avatar asked Jan 30 '19 15:01

Saman


People also ask

How do you make a parameter optional in flutter?

Curly brackets {} are used to specify optional, named parameters in Dart.

How do you make a parameter optional in Dart?

A parameter wrapped by { } is a named optional parameter. Also, it is necessary for you to use the name of the parameter if you want to pass your argument.

How do you pass parameters to widgets in flutter?

Steps to Pass Data to Stateful Widget in Flutter To pass data to stateful widget, first of all, create two pages. Now from the first page open the second page and pass the data. Inside the second page, access the variable using the widget. For example widget.


2 Answers

Optional parameters can be either positional or named, but not both.

Named parameters are optional by default so you don't have to assign the default value.

If a parameter is optional but can’t be null, provide a default value.

With null safety

class TextInputWithIcon extends StatefulWidget {   final String iconPath;   final String placeHolder;   final Function(bool)? onFocusChange; // nullable and optional      const TextInputWithIcon(       {Key? key,       required this.iconPath, // non-nullable and required       this.placeHolder = "", // non-nullable but optional with a default value       this.onFocusChange, // nullable and optional       })       : super(key: key);    @override   _TextInputWithIconState createState() => _TextInputWithIconState();  } 

Without null safety

const TextInputWithIcon(       {Key key,       @required this.iconPath,       this.placeHolder = "",       this.onFocusChange })       : super(key: key); 

Usage:

void _focusChanged(bool value) {      // using null-aware operator (for both with and without null safety)     onFocusChange?.call(value);          // or without null-aware operator           // with null safety     if(onFocusChange != null) {       onFocusChange!(value);     }      // without null safety     if(onFocusChange != null) {       onFocusChange(value);     }    } 

Have a look at Optional Parameters to understand better.

Edit: Thank you Jonah Williams to clarification.

like image 127
Umair M Avatar answered Oct 16 '22 03:10

Umair M


You can use a default value that does nothing:

class TextInputWithIcon extends StatefulWidget {   final String iconPath;   final String placeHolder;   final Function(bool) onFocusChange;   const TextInputWithIcon(       {Key key,       @required this.iconPath,       this.placeHolder = "",       this.onFocusChange = _dummyOnFocusChange})       : assert(onFocusChange != null), super(key: key);    @override   _TextInputWithIconState createState() => _TextInputWithIconState();    static dynamic _dummyOnFocusChange(bool val) {} } 

I created a static named function instead of just a closure as a default value because closures are not const and currently default values need to be const.

I added the assert(...) to ensure that an error is shown when null is passed explicitly.

like image 35
Günter Zöchbauer Avatar answered Oct 16 '22 02:10

Günter Zöchbauer