Ожидается 1 позиционный аргумент (ы) (Flutter, ios) - PullRequest
0 голосов
/ 07 августа 2020

Я уверен, что это будет просто и легко, но я еще слишком новичок и не имею ни малейшего представления о том, как решить.

У меня возникла проблема с моей программой , в том смысле, что мне нужно было запустить метод / функцию в моем классе, но я не мог просто добавить класс, содержащий его в качестве конечной переменной, в класс, который в нем нуждался, потому что я не мог быть уверен, что конкретная копия класс, которому он нужен, будет активен в иерархии.

Итак, мое решение (благодаря переполнению стека) заключалось в том, чтобы отделить logi c out благодаря предложению Как вызвать метод из другого class в Flutter (Dart)?

Хотя при попытке его реализации было обнаружено несколько ошибок.

Мне удалось выделить функции / методы в отдельный лог c class, и добавьте только класс logi c в качестве финала, не проблема.

переход от:

class MyClass extends StatefulWidget {
  // Random code that is unimportant to the question
  void myMethod(){}

}

к:

class Logic {

void myMethod(){}
}

class MyClass extends StatefulWidget {
  final Logic logic;
  MyClass(this.logic);
  // Random code that is unimportant to the question
  
}

и используя this.myMethod (); вызвать функцию - это нормально, никаких проблем.

Моя проблема, однако, заключается в том, что в программе несколько раз я создаю экземпляр MyClass (); и, по-видимому, сейчас ему не хватает «позиционного аргумента», в котором он раньше не нуждался. Я попытался добавить позиционный аргумент для Logi c: но это был недоступен, так что ... что нужно? Я знаю, что мне просто нужно передать им кое-что, но я не знаю что.

1 Ответ

2 голосов
/ 07 августа 2020

Что ж, я понимаю, что ошибка может сбивать с толку, потому что синтаксис dart немного отличается от Java и других распространенных языков конструктора. Когда вы определяете конструктор в MyClass (т.е. MyClass(this.logic)), вы сказали ожидать, что экземпляр класса Logic будет передан в первой позиции.

Итак, исходя из вашего примера:

class Logic {
  void myMethod(){}

  // in dart, classes have an automatic zero-argument constructor
}

class MyClass extends StatefulWidget {
  final Logic logic;
  MyClass(this.logic);
  // Random code that is unimportant to the question
}

Чтобы использовать его, вам нужно сделать что-то вроде этого:

void main() {
  final logic = Logic();
  final myClass = MyClass(logic);

  // do whatever with myClass
}

Конструктор эквивалентен этому:

class MyClass extends StatefulWidget {
  final Logic logic;
  MyClass(Logic logic): logic = logic;
}

Немного фона, если вы использовали необязательный позиционный аргумент, для него не потребовалось бы logi c, а logi c по умолчанию будет иметь значение null:

class MyClass extends StatefulWidget {
  final Logic logic;
  MyClass([this.logic]);
}

void main() {
  final myClass = MyClass();
}

И аналогично, если бы вы использовали именованный аргумент, он бы не это тоже не требуется, но если вы действительно хотите передать его, вам нужно будет указать имя:

class MyClass extends StatefulWidget {
  final Logic logic;
  MyClass({this.logic});
}

void main() {
  final myClass = MyClass(logic: Logic());
}

Если у вас проблемы с dart-specifici c вещами, я d настоятельно рекомендую использовать java -to-dart codelab a go, поскольку он объясняет множество синтаксических c различий между традиционными языками, такими как java / c# и c ++, в некоторой степени (tbh dart позаимствовал немного у каждого).

...