Использование оператора двойной точки (..) / каскадирования в 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
Надеюсь, это поможет.