Flutter 中 ChangeNotifier 的构建器小部件

Sur*_*gch 28 dart flutter flutter-change-notifier

背景

  • AValueNotifier有一个ValueListenableBuilder小部件。
  • AStream有一个StreamBuilder小部件。
  • AFuture有一个FutureBuilder小部件。

问题

  • 建造者是做什么用的ChangeNotifier

我尝试过的

我尝试使用ValueListenableBuilderwithChangeNotifierChangeNotifier没有实现ValueListenable

我知道我可以使用ChangeNotifierProviderProvider软件包,但我想知道是否有不需要第三方软件包的解决方案。

Sur*_*gch 24

使用ListenableBuilder

这是一个补充答案,演示了ListenableBuilder如何在ChangeNotifier.

这只是标准的计数器应用程序。

counter_model.dart

import 'package:flutter/foundation.dart';

class CounterModel extends ChangeNotifier {
  int _counter = 0;

  int get count => _counter;

  void increment() {
    _counter++;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

主程序.dart

import 'counter_model.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _counterModel = CounterModel();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            ListenableBuilder(
              listenable: _counterModel,
              builder: (context, child) {
                return Text(
                  '${_counterModel.count}',
                  style: Theme.of(context).textTheme.headlineMedium,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _counterModel.increment,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:之前这个答案演示了AnimatedBuilder.

注意:在这种特殊情况下(与大多数情况一样),aValueNotifierValueListenableBuilder就足够了。请参阅极简主义者的 Flutter 状态管理


Ami*_*aei 19

ChangeNotifier 是 Listenable Widget 的直接实现,对于 Listenable,您可以使用 AnimatedBuilder,它会触发从 Listenable 重建而无需传回特定值此外,您的类可以从 ChangeNotifier 扩展并向其添加新功能,并且您可以创建一个基于这些新功能的自定义生成器小部件


Sua*_*aya 6

从今天起,AnimatedBuilder 已重命名并更新为ListenableBuilder

希望文档很快就会更新,但您可以在此处查看相关问题和示例https://github.com/flutter/flutter/pull/116543/files