无法从类调用Flutter提供程序的方法

n9vozmp4  于 2023-03-04  发布在  Flutter
关注(0)|答案(2)|浏览(128)

我已经使用提供程序包来管理flutter应用程序的状态,但是我在使用它时遇到了很多问题。我已经定义了一个简单的提供程序,它有一个布尔变量和一个更改变量值的方法

class LoadingModel with ChangeNotifier{
      bool is_loading=false;

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

现在,我想从主页中的MyApp类调用提供程序中定义的changeLoadingState()方法,下面是主页代码

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小部件的上级
  • 向提供程序提供类型
  • 向使用者提供类型
  • 向Provider提供类型。of()
  • 始终使用包导入。例如:'导入'包:我的应用程序/我的代码. dart ';
  • 确保使用正确的context

如果这些解决方案都不起作用,请将错误提交到:https://github.com/rrousselGit/provider/issues
我怎样才能解决这个问题?

dffbzjpn

dffbzjpn1#

试试这个。希望你不会出错。

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();
                    },
                  )
                ],
              )
            ],
          )),
        ));
      }),
    );
  }
}
sycxhyv7

sycxhyv72#

您需要为布尔值创建getter

class LoadingModel with ChangeNotifier{
   bool is_loading = false;

  bool get loadingState(){
    is_loading = is_loading ? false : true;
    return is_loading;
  };

然后在myApp中, Package 小部件树中您希望使用Consumer重新构建的部分,并可以如下所示调用getter:

Consumer<LoadingModel>(context, loadingModel, _){
   ...
   RaisedButton(
     child: Text("hide the progress"),
        onPressed: () {
           loadingModel.loadingState();
         },
    )

相关问题