首页 > 解决方案 > 消费者提供者似乎没有通知听众?

问题描述

下面的最小可重现代码旨在在按下按钮时有一个加载图标(以模拟发生异步计算时的加载)。

出于某种原因,Consumer Provider 在回调期间不会重建小部件。


我的观点:

class HomeView extends StatefulWidget {

  const HomeView();

  @override
  _HomeViewState createState() => _HomeViewState();
}

class _HomeViewState extends State<HomeView> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ChangeNotifierProvider(
        create: (_) => HomeViewModel(99),
        child: Consumer<HomeViewModel>(
          builder: (_, myModel, __) => Center(
            child: ButtonsAtBottom(
              addEventAction: () => myModel.increment(context),
              busy: myModel.busy
            ),
          ),
        ),
      ),
    );
  }
}

我模拟执行业务逻辑的模型:

class HomeViewModel extends LoadableModel {
  late int integer;
  HomeViewModel(this.integer);
  
  void increment(BuildContext context) {
    super.setBusy(true);
    Future.delayed(Duration(seconds: 3), () => print(integer++));
    super.setBusy(false);
    //Passed in context just to try to simulate my real app
    //print(context);
  }
}

class LoadableModel extends ChangeNotifier {
  bool _busy = false;
  bool get busy => _busy;

  void setBusy(bool value) {
    _busy = value;
    notifyListeners();
  }
}

问题:当回调执行并执行其中的setBusy()方法时,它们应该通知侦听器并更新其中busy传递的字段。随后,应显示文本或加载程序。

但是,busy字段永远不会更新并保持为false.

class ButtonsAtBottom extends StatelessWidget {
  final bool busy;
  final void Function() addEventAction;
  const ButtonsAtBottom({required this.busy, required this.addEventAction});

  @override
  Widget build(BuildContext context) {
    print("busy value: $busy");
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        IconButton(
          onPressed: () => Navigator.pop(context),
          icon: Icon(Icons.clear_rounded),
        ),
        ElevatedButton.icon(
            onPressed: addEventAction,
            icon: Icon(Icons.save_alt_rounded),
            label: busy
                ? CircularProgressIndicator.adaptive(
                    backgroundColor: Colors.white,
                  )
                : Text("Save")),
      ],
    );
  }
}

标签: flutterdartflutter-provider

解决方案


你尝试过等待未来吗?


推荐阅读