You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中ChangeNotifierProvider示例是否存在反模式?

你的ChangeNotifier实现的反模式问题说明

你的代码整体逻辑通顺、能正常运行,但确实存在两个和ChangeNotifier使用相关的反模式问题:

  • 直接访问私有成员变量
    你在UI层的Text组件里直接调用了model._mydata,_mydata是类的私有成员,外部直接访问破坏了封装性。一旦未来需要修改数据的计算逻辑(比如给数值加固定基数),你就得修改所有引用_mydata的UI代码,维护成本会大幅提升。正确的做法是给私有变量添加公共getter方法。

  • (潜在问题)不必要的多次notifyListeners调用
    当前的increment和decrement方法里每次修改都调用notifyListeners是没问题的,但如果以后需要批量修改数据(比如一次做多个数值调整),不要每修改一次就调用一次notifyListeners,应该在所有修改完成后统一调用,避免触发多次不必要的UI重绘。

修正后的代码示例

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

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => MyModel(),
      child: const MainApp(),
    ),
  );
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Consumer<MyModel>(
            builder: (context, model, child) => Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                // 使用公共getter访问数据
                Text('Total price: ${model.count}'),
                const SizedBox(height: 16),
                ElevatedButton(
                  onPressed: model.increment,
                  child: const Text("Add"),
                ),
                const SizedBox(height: 8),
                ElevatedButton(
                  onPressed: model.decrement,
                  child: const Text("Minus"),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class MyModel extends ChangeNotifier {
  var _count = 0;

  // 公共getter暴露数据
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void decrement() {
    _count--;
    notifyListeners();
  }

  // 示例:批量操作时统一调用notifyListeners
  void batchUpdate() {
    _count += 5;
    _count *= 2;
    // 只调用一次,避免多次重绘
    notifyListeners();
  }
}

额外小建议:把_mydata改成更具语义的名字(比如_count),能大幅提升代码可读性。

内容的提问来源于stack exchange,提问作者Chris Snow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:26:03