Правильный поставщик Flutter не найден при использовании с виджетами платформы PlatformScaffold - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь использовать ChangeNotifierProvider для установки заголовка / информации AppBar и использую PlatformApp / PlatformScaffold / PlatformAppBar из flutter_platform_widgets вместо написания отдельных виджетов материалов / Купертино для каждого маршрута. Однако при переходе на эту страницу или с этой страницы я получаю ProviderNotFoundException со следующей ошибкой:

Error: Could not find the correct Provider<MyModel> above this Consumer<MyModel> Widget

Я попытался разделить свой ChangeNotifierProvider на отдельный виджет без сохранения состояния. над виджетом, содержащим PlatformScaffold, но это не решило проблему. Я также попытался обернуть дочерний элемент ChangeNotifierProvider виджетом Builder, но это тоже не сработало. Я предполагаю, что это как-то связано с жизненным циклом PlatformScaffold, поскольку ошибка присутствует только на экране устройства, когда страница находится в процессе перехода к странице или ее всплывающего окна. Я также пробовал переключиться на обычные строительные леса или скаффолды из Купертино (без использования виджетов платформы), и провайдер работал должным образом, как я и ожидал, при этом провайдер был правильно включен в BuildContext.

class MyPageProvider extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<MyModel>(
      create: (BuildContext context) => MyModel(
        pageTitle: 'Initial Page Title',
        // Rest of initial provider class fields set here
      ),
      // I have tried wrapping this with a Consumer<MyModel> and with a Builder widget, but neither have solved this problem
      child: MyPage(),
    );
  }
}

class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<MyModel>(
      builder: (_, mymodel, __) => PlatformScaffold(
        appBar: PlatformAppBar(
          title: Text(mymodel.pageTitle),
          material: (_, __) => MaterialAppBarData(),
          cupertino: (_, __) => CupertinoNavigationBarData(
            leading: GestureDetector(
              onTap: () => Navigator.pop(context),
              child: Icon(
                Icons.arrow_back_ios,
                color: CupertinoTheme.of(context).primaryContrastingColor,
              ),
            ),
          ),
        ),
        body: MyPageBodyWidget(),
      ),
    );
  }
}

При необходимости я могу отказаться от виджетов платформы и go обратно, чтобы разделить виджеты Material / Cupertino, но я бы хотел, чтобы это работало, если это возможно. Спасибо за любую / всю помощь!

...