gpt4 book ai didi

flutter - 了解如何听 : false works when used with Provider. of(context, listen: false)

转载 作者:行者123 更新时间:2023-12-03 14:39:50 25 4
gpt4 key购买 nike

我正在了解 Provider 包如何与 Flutter 一起工作,但对 listen:false 的工作方式感到困惑。

我使用新 Flutter 项目中常见的 Counter 示例编写了一些基本代码。我使用 Provider 创建了三种类型的无状态小部件:

  • Provider.of(context)
  • 消费者
  • Provider.of(context, listen: false)

  • 第三个例子是展示如何在不重建的情况下访问提供者对象并调用它的方法。

    当我运行应用程序时,所有小部件计数都在发生变化 - 我只希望它在前两个发生变化。

    这是一个简单的例子 - 我做错了什么?

    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不想重建,它的 parent 强制它重建。
    在您的示例中,当 Counter变化,MyHomePage重建并重新创建指定的小部件 listen:false ,这反过来也迫使它重建。MyHomePage应指定 listen: false也在这里。

    关于flutter - 了解如何听 : false works when used with Provider<SomeType>. of(context, listen: false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58584334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com