Переменные внутри скобок перед функциями обратного вызова во Flutter передаются как аргументы в эти функции обратного вызова? - PullRequest
0 голосов
/ 10 июля 2020

В целом, и в этих примерах для ясности, какова природа скобок и их содержимого (содержимое - context в Ex1 и ничего в Ex2)?

Ex1.

ChangeNotifierProvider(
    create: (context) {
        return CartModel();
    },
),

Ex2.

FlatButton(
    onPressed: () {
        print("yay button")
    }
),

Насколько я понимаю, код внутри скобок { } является функциями обратного вызова, которые выполняются только тогда, когда методы create и onPressed некоторых экземпляров классы ChangeNotifierProvider и FlatButton выполняются соответственно.

Какова природа содержимого круглых скобок? Являются ли они переменными, которые передаются в качестве аргументов в функцию обратного вызова?

Если они передаются в качестве аргументов в функцию обратного вызова, почему вместо этого не используется синтаксис первого примера:

ChangeNotifierProvider(
    create: CartModel(context),
),

?

1 Ответ

1 голос
/ 10 июля 2020
ChangeNotifierProvider(
    create: CartModel(context),
),

Это именованная переменная ("create"), принимающая CartModel в качестве аргумента, который был создан заданным context в качестве параметра конструктора.

ChangeNotifierProvider(
    create: (context) {
        return CartModel();
    },
),

Это именованный переменная ("создать") с аргументом CartModel Function(Context). Эта функция может быть вызвана в любое время и несколько раз с помощью ChangeNotifierProvider. Когда ChangeNotifierProvider вызывает метод, он передает Context в качестве аргумента методу, который он может использовать.

Обновление с примером

Вот небольшой пример кода, показывающий поведение:

class A {
  B Function() createB;
  B b;

  A.callback({B Function() create}) : createB = create {
    print('Class A created');
  }

  A.value({B create}): b = create {
    print('Class A created');
  }

  void init() {
    b = createB();
  }
}

class B {
  B() {
    print('Class B created');
  }
}

void main() {
  A.value(create: B());
  // Class B created
  // Class A created

  final a = A.callback(create: () => B());
  // Class A created

  a.init();
  // Class B created
}
...