我正在努力了解Provider程序包如何与Flutter一起使用,但对listen:false的工作方式感到困惑。
我使用来自新Flutter项目的常规Counter示例编写了一些基本代码。我使用提供程序创建了三种类型的无状态窗口小部件:
第三个示例显示了如何在不重建提供程序对象的情况下访问提供程序对象并对其调用方法。
当我运行该应用程序时,所有小部件计数都在变化-我只希望它在前两个中有所变化。
这是一个简单的示例-我在做什么错?
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main() => runApp(MyApp()); class Counter with ChangeNotifier { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(builder: (_) => Counter()), ], child: MaterialApp( title: 'Provider Demo', theme: ThemeData( primarySwatch: Colors.amber, ), home: MyHomePage(title: 'Provider Demo Home Page'), ), ); } } class MyHomePage extends StatelessWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override Widget build(BuildContext context) { Counter counter = Provider.of<Counter>(context); return Scaffold( appBar: AppBar( title: Text(title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ ExampleProviderWidget(), ExampleConsumerWidget(), ExampleNoListenWidget() ], ), ), floatingActionButton: FloatingActionButton( onPressed: () => counter.increment(), tooltip: 'Increment', child: Icon(Icons.add), ), ); } } class ExampleProviderWidget extends StatelessWidget { @override Widget build(BuildContext context) { Counter counter = Provider.of<Counter>(context); return Container( color: Colors.green, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'Provider.of<Counter>(context):', ), Text( '${counter.count}', style: Theme.of(context).textTheme.display1, ), ], ), ), ); } } class ExampleConsumerWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<Counter>( builder: (context, counter, _) { return Container( color: Colors.blue, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'Consumer<Counter>(context):', ), Text( '${counter.count}', style: Theme.of(context).textTheme.display1, ), ], ), ), ); }, ); } } class ExampleNoListenWidget extends StatelessWidget { @override Widget build(BuildContext context) { Counter counter = Provider.of<Counter>(context, listen: false); return Container( color: Colors.red, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'Provider.of<Counter>(context, listen: false):', ), Text( '${counter.count}', style: Theme.of(context).textTheme.display1, ), RaisedButton( child: Text("Increment"), onPressed: () => counter.increment(), ) ], ), ), ); } }
这是因为,而被称为小部件Provider.of有listen:false没有重建要重建,其母公司是被逼的。
Provider.of
listen:false
在您的示例中,当进行Counter更改时,MyHomePage将重建并重新创建指定的窗口小部件,listen:false从而迫使其也进行重建。
Counter
MyHomePage
MyHomePage``listen: false在这里也应指定。
MyHomePage``listen: false