Инициализация блока в конструкторе провайдера и инициализация встроенного объявления переменной экземпляра блока - PullRequest
0 голосов
/ 30 мая 2019

После создания класса провайдера Bloc, который расширяет InheritedWidget, в чем разница между инициализацией переменной экземпляра блока внутри конструктора провайдера и ее инициализацией при объявлении переменной?

class CommentsProvider extends InheritedWidget {

  final CommentsBloc bloc;

  CommentsProvider({Key key, Widget child})
    : bloc = CommentsBloc(),
      super(key: key, child: child);
}

class CommentsProvider extends InheritedWidget {

  final CommentsBloc bloc = CommentsBloc();

  CommentsProvider({Key key, Widget child})
    : super(key: key, child: child);
}

1 Ответ

0 голосов
/ 31 мая 2019

Эти два строго эквивалентны, но оба варианта плохие.

Вы должны , а не создавать измененные данные внутри Inheritedwidget . Вы можете легко потерять свое состояние иэто считается плохой практикой.

Вместо этого рассмотрите возможность упаковки Inheritedwidge в StatefulWidget или используйте пакет, такой как provider.

Используя provider, вы не сможетебольше не нужно делать такой класс.Вместо этого вы можете напрямую сделать:

Provider(
  builder: (_) => CommentsBloc(),
  dispose: (_, bloc) => bloc.dispose(),
  child: Whatever(),
) 
...