Как инициализировать состояние с помощью пакета Provider? - PullRequest
0 голосов
/ 19 мая 2019
TL;DR - Getting providerInfo = null from Consumer<ProviderInfo>(
    builder: (context, providerInfo, child),

У меня есть приложение, которое использует scoped_model , которое прекрасно работает, но я хочу реорганизовать его, чтобы оно использовало Provider

Код с scoped_model:

//imports...
void main() {
  runApp(MyApp());
}
class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  final MainModel _model = MainModel();// The data class, extends scoped_model.Model class, with all of other models...
  bool _isAuthenticated = false;
  @override
  void initState() {
    _model.init();
    super.initState();
}
@override
  Widget build(BuildContext context) {
    return ScopedModel<MainModel>(
      model: _model,
      child: MaterialApp(
        title: "MyApp",
        routes: {
          '/': (BuildContext context) => _isAuthenticated == false ? AuthenticationPage() : HomePage(_model),
          '/admin': (BuildContext context) =>
              _isAuthenticated == false ? AuthenticationPage() : AdminPage(_model),
        },
// the rest of build...

}

и код, который я пытался реорганизовать для использования поставщика:

//@lib/main.dart
//imports...
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ProviderInfo>(
      builder: (context) {
        ProviderInfo(); // the data model. 
      },
      child: Consumer<ProviderInfo>(
        builder: (context, providerInfo, child) => MaterialApp(
              title: "MyApp",
              routes: {
                '/': (BuildContext context) {
                  providerInfo.isAuthenticated == false ? AuthenticationPage() : HomePage(providerInfo);
                },
                '/admin': (BuildContext context) {
                    providerInfo.isAuthenticated == false ? AuthenticationPage() : AdminPage(_model);
                },     
//the rest of build...
              },

//@ProviderInfo
class ProviderInfo extends CombinedModel with ProductModel, UserModel, UtilityModel {

  ProviderInfo() {
    this.init();
  }
}


Проблема с этим кодом состоит в том, что в функции компоновщика Consumer<ProviderInfo> providerInfo имеет значение null (а также, конечно, после маршрутов и т. Д.).

что я сделал не так? как я могу сделать рефакторинг, чтобы он работал нормально?

1 Ответ

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

Вы забыли что-то вернуть в builder вашего провайдера.

Изменить

 ProviderInfo() 

На

 return ProviderInfo() 
...