Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 单视图颤振的提供程序_Flutter_Dart_Flutter Provider - Fatal编程技术网

Flutter 单视图颤振的提供程序

Flutter 单视图颤振的提供程序,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,我正在处理弗利特的包裹。我想要实现的是为一个视图或页面提供一个简单的提供者。因此,我在我的小部件中尝试了以下操作: 小部件构建(构建上下文){ 返回ChangeNotifierProvider( 创建:()=>MyModel(), 孩子:脚手架( appBar:appBar( 标题:正文( “屏幕1”, ), ), 正文:_buildBody(), ), ); } 但是,当我尝试在我的\u buildBody()方法中使用provider.of(context,listen:false).va

我正在处理弗利特的包裹。我想要实现的是为一个视图或页面提供一个简单的提供者。因此,我在我的小部件中尝试了以下操作:

小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:()=>MyModel(),
孩子:脚手架(
appBar:appBar(
标题:正文(
“屏幕1”,
),
),
正文:_buildBody(),
),
);
}
但是,当我尝试在我的
\u buildBody()
方法中使用
provider.of(context,listen:false).value
访问提供程序时,我得到错误:

在此MyPageWidget上方找不到正确的提供程序

当我将提供者的声明移动到我在这个小部件上面声明我的应用程序的位置时,它就工作了。不幸的是,这使得提供者公开了我的所有视图,这不是我想要的。如何创建一个仅可在该视图或小部件中访问的提供者。谢谢你的帮助


注意:我尝试过这个,但仍然得到相同的结果


编辑:我可以在小部件树的顶部使用
消费者
,但如果我的整个小部件树都在
消费者
中,这不会导致页面重建过多。此外,如果我需要使用(…)的
Provider.of

尝试用consumer包装脚手架,该怎么办

Widget build(BuildContext context) {
return ChangeNotifierProvider<MyModel>(
  create: (_) => MyModel(),
  child: Consumer(
    builder: (context, MyModel model, _) => Scaffold(
      appBar: AppBar(
        title: Text(
          'Screen 1',
        ),
      ),
      body: _buildBody(),
    ),
  ));
}
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:()=>MyModel(),
儿童:消费者(
生成器:(上下文,MyModel模型,)=>Scaffold(
appBar:appBar(
标题:正文(
“屏幕1”,
),
),
正文:_buildBody(),
),
));
}

现在,您可以通过方法直接访问我的模型

尝试用consumer包装脚手架

Widget build(BuildContext context) {
return ChangeNotifierProvider<MyModel>(
  create: (_) => MyModel(),
  child: Consumer(
    builder: (context, MyModel model, _) => Scaffold(
      appBar: AppBar(
        title: Text(
          'Screen 1',
        ),
      ),
      body: _buildBody(),
    ),
  ));
}
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:()=>MyModel(),
儿童:消费者(
生成器:(上下文,MyModel模型,)=>Scaffold(
appBar:appBar(
标题:正文(
“屏幕1”,
),
),
正文:_buildBody(),
),
));
}

现在你可以通过方法直接访问我的模型了,我终于想出了一个解决方案,当发生@GJJ2019 answer这样的更改时,不需要重建整个小部件树。当我声明路线时,例如:

“/”:(上下文)=>MyScreen();
我用
ChangeNotifierProvider
包装我的屏幕,例如:

“/”:(上下文)=>ChangeNotifierProvider(
创建:()=>MyModel(),
孩子:MyScreen()),

因此,与其在小部件/屏幕中声明正在使用的提供程序,不如在声明路由的地方声明提供程序。

我最终想出了一个解决方案,在发生@GJJ2019 answer之类的更改时,不需要重建整个小部件树。当我声明路线时,例如:

“/”:(上下文)=>MyScreen();
我用
ChangeNotifierProvider
包装我的屏幕,例如:

“/”:(上下文)=>ChangeNotifierProvider(
创建:()=>MyModel(),
孩子:MyScreen()),

因此,与其在小部件/屏幕中声明正在使用的提供程序,不如在声明路由的位置声明提供程序。

这似乎是一种全面的实现方法,因为现在每次发生更改时都会重建整个小部件树,并且我必须将
模型
传递到每个函数中。我试图在提供程序中实现的是反模式,还是有更好的方法来实现这一点?当所有内容都由
使用者包装时,是否每次调用
notifyListeners()
,都会重建整个小部件树?但是如果我想在initState()或didChangedependencies()中从提供程序调用某个函数,使用上面的代码不可能做到这一点。这似乎是一种全面的实现方法,因为现在每次发生更改时都会重建整个小部件树,我必须将
模型
传递到每个函数中。我试图在提供程序中实现的是反模式,还是有更好的方法来实现这一点?当所有内容都由
使用者包装时,是否每次调用
notifyListeners()
,都会重建整个小部件树?但是如果我想在initState()或didChangedependencies()中从提供程序调用某个函数,使用上面的代码是不可能的。所以,我理解,我们应该把提供者放在应用程序的顶部,这意味着把他们放在Main.dart,对吗?所以,我理解,我们应该把提供者放在应用程序的顶部,这意味着把他们放在Main.dart,对吗?