Методы провайдера Flutter нельзя вызывать из классов - PullRequest
1 голос
/ 18 января 2020

Я использовал пакет провайдера для управления состоянием приложений флаттера, но у меня много проблем с его использованием. я определил простого поставщика, который имеет одну логическую переменную и один метод, которые изменяют значение переменной




     class LoadingModel with ChangeNotifier{
      bool is_loading=false;

      changeLoadingState(){
        is_loading = !is_loading;
        notifyListeners();
      }}

, теперь я хочу вызвать метод changeLoadingState (), который определен в поставщике из класса MyApp на главной странице, и вот код главной страницы



    void main() => runApp(MyApp());

    class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => LoadingModel(),
      child: MaterialApp(
        home:Scaffold(
          body: Center(
            child: Wrap(children: [
            Column(children: [
                RaisedButton(
              child: Text("hide the progress"),
              onPressed: () {
               Provider.of(context,listen: false).changeLoadingState();

                },
            )

            ],)
            ],)
          ),
        )
      ), 
    );
  }
}

, но когда я запускаю приложение, отображается консоль

Ошибка: не удалось найти правильный поставщик выше этого виджета MyApp

Исправить , пожалуйста:

  • Убедитесь, что поставщик является предком этого виджета MyApp
  • Предоставьте типы поставщику
  • Предоставьте типы потребителю
  • Предоставьте типы to Provider.of ()
  • Всегда использовать импорт пакетов. Пример: `import 'package: my_app / my_code.dart';
  • Убедитесь, что используется правильный context.

Если ни одно из этих решений не работает, пожалуйста, сообщите об ошибке в: https://github.com/rrousselGit/provider/issues

как я могу решить эту проблему ???

1 Ответ

2 голосов
/ 18 января 2020

Попробуйте это. Надеюсь, вы не получите ошибку.

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<LoadingModel>(
      create: (context) => new LoadingModel(),
      child: Consumer<LoadingModel>(builder: (context, loadingModel, _) {
        return MaterialApp(
            home: Scaffold(
          body: Center(
              child: Wrap(
            children: [
              Column(
                children: [
                  RaisedButton(
                    child: Text("hide the progress"),
                    onPressed: () {
                      loadingModel.changeLoadingState();
                    },
                  )
                ],
              )
            ],
          )),
        ));
      }),
    );
  }
}
...