Вы можете использовать подчеркивание (не дефис) вместо указания имени параметра, если не используете значение, переданное параметру.
В вашем примере с потребителем подчеркивание используется потому, что BuildContext
не используется в функции построителя; вам не нужно создавать экземпляры Scaffold
, AppBar
и Text
. С другой стороны, вам нужен один для того, чтобы позвонить Scaffold.of(context).showSnackBar()
.
. Таким же образом вы можете заменить counter
и child
на __
и ___
(двойные и тройные подчеркивания соответственно) так как они тоже не используются. Обратите внимание, что вы не можете использовать одно подчеркивание для каждого из них, поскольку оно уже используется вместо контекста.
Пример использования BuildContext в Consumer
You Можно подумать, что он работает так же, как в классе Builder
.
Scaffold(
body: ChangeNotifierProvider<Foo>(
create: (context1) => Foo(),
child: Consumer<Foo>(
builder: (context2, foo, child) {
return RaisedButton(
child: Text(foo.message),
onPressed: () {
// You can get ScaffoldState using context2
// which is impossible with context1
Scaffold.of(context2).showSnackBar(...);
},
);
},
},
),
)
Для получения дополнительной информации см. здесь .
Что такое строитель?
builder
- это аргумент, в котором вы передаете функцию, которая вызывается при необходимости с некоторыми значениями, переданными для вашего удобства.
Многие виджеты имеют builder
, но, например, Consumer , он получает некоторое значение, заданное Provider()
где-то в дереве, а затем вызывает функцию построителя с значения, включая полученное, для построения дерева виджетов с использованием виджета, возвращенного функцией.
В вашем примере Consumer
получает значение счетчика от предка и вызывает функцию builder
, передавая в BuildContext
, значение счетчика (полученное от предка) и дочерний виджет (который является null
, если вы опустите аргумент child
Consumer
).