Использование оператора двойной точки (..) / каскадирования в ChangeNotifierProvider

ChangeNotifierProvider(
  builder: (context) => AppStateModel()..loadBrands(),
  child: MyTestApp(),
)

Почему мы должны так звонить AppStateModel()..loadBrands(), как здесь нам помогает каскад?

2 ответа

В builder (теперь называется create) of необходимо вернуть экземпляр класса уведомителя об изменениях, которым в данном случае является. Обычно это делается так:

      create: (context) => AppStateModel(),

Однако иногда вы также хотите запустить какой-либо метод при первом создании класса, в данном случае метод. Если вы попытались сделать это с помощью одной точки, например:

      create: (context) => AppStateModel().loadBrands(),

Он действительно вызовет метод, но также даст возвращаемое значение метода, которое, вероятно, void или же Future<void>, а не то, что ChangeNotifierProvider потребности.

С другой стороны, использование оператора двойной точки возвращает AppStateModel сам по себе, все еще называя loadBrands метод в дополнение к этому:

      create: (context) => AppStateModel()..loadBrands(),

Это эквивалентно:

      create: (context) {
  final model = AppStateModel();
  model.loadBrands();
  return model;
},

Я иногда нахожу ..оператор трудно читать. Просто используйте ту форму, которая вам понятна.

Каскадная запись (..)

Каскады (..) позволяют выполнять последовательность операций над одним и тем же объектом. Помимо вызовов функций, вы также можете получить доступ к полям того же объекта. Это часто избавляет вас от необходимости создавать временную переменную и позволяет писать более гибкий код.

Например, в вашем случае вы можете использовать Cascade operator нравиться:

//call the method of app state class without creating a variable to hold an instance of the class
 AppStateModel()..loadBrands();

Вместо создания такой переменной, как:

//create an object of appstate and store in a variable
AppStateModel appState;
//access the methods of appstate class
appSate.localBrands();

Чтобы узнать больше о Cascade Operator, проверьте ссылку ниже:Cascade Operators

Надеюсь, это поможет.

Другие вопросы по тегам