I have a class FoodDetails which accepts a list of names
class FoodDetails extends StatefulWidget {
FoodDetails({this.namesList});
final List namesList;
#override
State<FoodDetails> createState() => FoodDetailsState();
}
I want to create objects of a class NameClass based on the names of namesList.
For example:
If namesList=["John", "Doe"];
I want to create lists like
List<NameClass> John;
List<NameClass> Doe;
How can I achieve this? I tried the following but it doesn't work
class FoodDetailsState extends State<FoodDetails> {
void initState() {
super.initState();
for (int i = 0; i < widget.namesList.length; i++) {
List<NameClass> widget.namesList[i];
}
}
}
You cannot create objects dynamically like javascript in dart.
Easy workaround would be using HashMap in which the key will be the desired dynamically allocated name and the value will be the instance of the object.
Code snippet which would help you start with this:
import 'dart:collection';
class Class {
String? var1;
String? var2;
Class({var1, var2}) {
this.var1 = var1;
this.var2 = var2;
}
}
void main() {
var list = ["John", "Doe"];
HashMap<String, Class> map = new HashMap();
list.forEach((element) {
map.addAll({element: new Class()}); // Just adding the key to the Map
});
print(map.containsKey("John"));
print(map.containsKey("Doe"));
// Can easily manipulate the value known the key
map["John"]!.var1 = "variable1";
map["Doe"]!.var2 = "variable2";
map.forEach((key, value) {
print("Key: " +
key +
" has values var1: " +
(value.var1 ?? "") +
" and var2: " +
(value.var2 ?? ""));
});
}
The output would be:
true
true
Key: John has values var1: variable1 and var2:
Key: Doe has values var1: and var2: variable2
Related
There are red dots under the _paMachine. How do I fix this error so the paMachine prints a new string every time I press the floating action button?
class _MyHomePageState extends State<MyHomePage> {
String *_paMachine()* {
setState(() {
var bar = Random().nextInt(26) + 97;
var nar = Random().nextInt(26) + 97;
String foo =
'${String.fromCharCode(nar)}om ${String.fromCharCode(bar)}ey';
print(foo);
});
}
Just add a return to your function
class _MyHomePageState extends State<MyHomePage> {
String *_paMachine()* {
var bar = Random().nextInt(26) + 97;
var nar = Random().nextInt(26) + 97;
String foo =
'${String.fromCharCode(nar)}om ${String.fromCharCode(bar)}ey';
print(foo);
setState(() {
});
return foo;
}
By adding a prefix String you are mentioning the engine that the method will return a value of type String. So the method will expect you to return a string.. If you don't wish to return anything from the method you can remove the String and write it like
paMachine() {
setState(() {
var bar = Random().nextInt(26) + 97;
var nar = Random().nextInt(26) + 97;
String foo =
'${String.fromCharCode(nar)}om ${String.fromCharCode(bar)}ey';
print(foo);
});
}
If you wish to return a value from the method add a return at the end of the method like
String paMachine() {
String foo = "";
setState(() {
var bar = Random().nextInt(26) + 97;
var nar = Random().nextInt(26) + 97;
foo =
'${String.fromCharCode(nar)}om ${String.fromCharCode(bar)}ey';
print(foo);
});
return foo;
}
Click Here to see Dartpad Screenshot
void main(){
Student file1 = Student.empty;
Student file2 = Student.empty;
file1.name = 'ABC';
file2.name = 'DEF';
print(file1.name);
print(file2.name);
}
class Student{
String name;
Student({
required this.name,
});
static Student empty = Student(name: '');
}
Output Value
DEF
DEF
Expected Value
ABC
DEF
This happens, because you are using the same static instance of Student, since the static field is shared across all instances of Student.
So your variables file1 and file2 are referencing the same single instance of Student.
You may want to use a factory constructor instead:
https://dart.dev/guides/language/language-tour#factory-constructors
void main() {
Student file1 = Student.empty();
Student file2 = Student.empty();
file1.name = 'ABC';
file2.name = 'DEF';
print(file1.name);
print(file2.name);
}
class Student {
String name;
Student({
required this.name,
});
factory Student.empty() {
return Student(name: '');
}
}
so i recently started learning dart and I've found something kinda interesting.
why do we use constructors and getters/setters when we can achieve same results without them? (atleast when used for basic things).
class v1{
var name;
int age;
v1(this.name, this.age);
info(){
print("my name is $name and i am $age");
}
}
class v2{
var name = "bash";
int age = 100;
info(){
print("my name is $name and i am $age");
}
}
class v3{
var namee;
int agee;
String get name => namee;
int get age => agee;
set name(String name) => this.namee = name;
set age(int age) => this.agee = age;
info(){
print("my name is $name and i am $age");
}
}
void main(){
var x = v1("bash", 100);
x.info(); //my name is bash am i am 100
var z = v2();
var Z = v2();
Z.name = "vert";
Z.age = 20;
z.info(); //my name is bash and i am 100
Z.info(); //my name is vert and i am 100
var y = v3();
y.name = "rizz";
y.age = 40;
y.info(); //my name is rizz and i am 40
}
Here's a more correct version of your class:
class User {
final bool _isMale;
String _name;
int _age;
User(this._isMale, this._name, this._age);
bool isMale => _isMale;
String get name => _name;
int get age => _age;
set name(String name) {
// Sometimes you may want to update other properties here.
// For example:
// _isUpdated = true;
_name = name;
}
set age(int age) {
_age = age;
}
void info() {
print("my name is $name and i am $age");
}
}
Constructors are useful when you want to assign initial values to the class fields. They are essential if you need to assign final fields, as they are assignable only on class initialization (see _isMale field).
Setters are useful when you want to update other fields along with the field that's being modified.
Getters protect the internal state from being modified outside. In this example, nobody can change _isMale field.
You don't need to use getters and setters unless you have to.
You use getters and setters if you need to store the data in a private field, or if you want to modify it when saving or returning the value.
class Abc {
String _field;
String _otherField;
String anotherField; // No getters and setters required for this.
String get field => _field;
set field(String field) => _field = field;
String get otherField => "The value of otherField is: " + _otherField;
set otherField(String otherField) => _otherField = "[String] " + otherField;
}
As for constructors, you use them to initialize the object with custom values. When you need to work with immutable objects (which use final variables), you'll have to use constructors to set their initial value. You can also modify the incoming value according to your need before storing it,
class Def {
final field; // Dart generates getters for this field, but it's value can't be modified once the object is instantiated.
final _otherField; // No getters for this.
Def(String field, String otherField) {
this.field = "[String] $field"
this._otherField = "[String] $otherField"
}
String describeMe() {
return "[Def]: field: $field, _otherField: $_otherField"
}
}
How to add Variable in a Class Programmatically?
for example this is my current Variables in my class
Before
class ChartSampleData {
ChartSampleData({
this.yValue1,
this.yValue2,
});
num yValue1;
num yValue2;
}
Is there any way to add variable programmatically based on how many i want
just like this:
After
class ChartSampleData {
ChartSampleData({
this.yValue1,
this.yValue2,
this.yValue3, // NEW
this.yValue4, // NEW
});
num yValue1;
num yValue2;
num yValue3; //NEW
num yValue4; //NEW
}
No, You can use Map to add and get values.
For example
class ChartSampleData {
ChartSampleData({
});
Map values = Map();
addNewValue(String key, String value) {
values.add(key, value);
}
String getValue(String key){
return values[key];
}
}
No. But you can use a list or array or any data structures that allow adding or removing elements. Example:
class ChartSampleData{
List<num> yValues;
ChartSampleData({this.yValues});
}
i want to do use the model's properties such as:
Animal.id as a param to a function or use some extension method to be able to "id". similarly, i'd like to use Animal.title in that way to get "title" as a returned value. how could i do this with my class to get a string for any given property name?
int _id;
String _title;
Animal(this._id, this._title);
int get id => _id;
String get title => _title;
}
the usage case is being able to query without having autocomplete on my model's property names in a string for sql querying:
List<Map> results = await db.query("Animal",
columns: Set. ["id", "title"],
where: 'id = ?',
whereArgs: [id]);
Using the dart:mirrors package you can dynamically access your class properties and invoke methods using their string names.
https://api.dart.dev/stable/2.4.0/dart-mirrors/dart-mirrors-library.html
import 'dart:mirrors';
class Animal {
int _id;
String _title;
Animal(this._id, this._title);
int get id => _id;
String get title => _title;
}
main() {
var r = reflect(Animal(1, 'Dog'));
print(r.getField(Symbol('id')).reflectee);
print(r.getField(Symbol('title')).reflectee);
}
import 'dart:mirrors';
class MyClass {
int i, j;
void my_method() { }
int sum() => i + j;
MyClass(this.i, this.j);
static noise() => 42;
static var s;
}
main() {
MyClass myClass = new MyClass(3, 4);
InstanceMirror myClassInstanceMirror = reflect(myClass);
ClassMirror MyClassMirror = myClassInstanceMirror.type;
InstanceMirror res = myClassInstanceMirror.invoke(#sum, []);
print('sum = ${res.reflectee}');
var f = MyClassMirror.invoke(#noise, []);
print('noise = $f');
print('\nMethods:');
Iterable<DeclarationMirror> decls =
MyClassMirror.declarations.values.where(
(dm) => dm is MethodMirror && dm.isRegularMethod);
decls.forEach((MethodMirror mm) {
print(MirrorSystem.getName(mm.simpleName));
});
print('\nAll declarations:');
for (var k in MyClassMirror.declarations.keys) {
print(MirrorSystem.getName(k));
}
MyClassMirror.setField(#s, 91);
print(MyClass.s);
}
the output:
sum = 7
noise = InstanceMirror on 42
Methods:
my_method
sum
noise
All declarations:
i
j
s
my_method
sum
noise
MyClass
91