трепетать в некоторых случаях, используя дефис в пространстве buildContext - PullRequest
1 голос
/ 27 апреля 2020

BuildContext показывает, какой виджет в дереве, так что каждый виджет имеет это. а также я знаю, почему виджет строителя нужен в приведенном ниже примере

 Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Container(),
      /// Builders let you pass context
      /// from your *current* build method
      /// Directly to children returned in this build method
      ///
      /// The 'builder' property accepts a callback
      /// which can be treated exactly as a 'build' method on any
      /// widget
      floatingActionButton: new Builder(builder: (BuildContext context) {
        return new FloatingActionButton(onPressed: () {
          Scaffold.of(context).showSnackBar(
                new SnackBar(
                  backgroundColor: Colors.blue,
                  content: new Text('SnackBar'),
                ),
              );
        });
      }),
    );
  }

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

builder: (_) {}

, как это

return Consumer<CounterProvider>
( builder: (_, counter, child) => Scaffold( appBar: AppBar( title: Text(widget.title), ),

или вот так как это работает? почему контекст не нужен?

1 Ответ

0 голосов
/ 27 апреля 2020

Вы можете использовать подчеркивание (не дефис) вместо указания имени параметра, если не используете значение, переданное параметру.

В вашем примере с потребителем подчеркивание используется потому, что 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...