无法使用颤振 Bloc 模式更新小部件外部的 UI

Posted

技术标签:

【中文标题】无法使用颤振 Bloc 模式更新小部件外部的 UI【英文标题】:Cannot update UI outside of widget using flutter Bloc pattern 【发布时间】:2021-01-18 17:00:16 【问题描述】:

我正在 Flutter 中尝试 Bloc。例如,在有状态小部件中调用块函数时,它似乎工作正常:

 RaisedButton(
 onPressed: () => _nextStep(),
 child: Text("Next"))

这将调用 _nextStep() 函数并更新 UI。 nextStep 函数:

  _nextStep() async 
_bloc.StepEventSink.add(NextStep());

然后我使用 StreamBuider 搭建小部件,这样就可以了。但是,如果我在课堂之外调用 _nextStep(),数据会更新,但 UI 不会。示例:

class FormWizard extends StatefulWidget 
  @override
 _FormWizardState createState() => _FormWizardState();
  next() 
_FormWizardState()._nextStep();
  
 

如何在小部件之外更新 UI?

【问题讨论】:

那你有什么建议? 【参考方案1】:

我通过使用提供者状态管理解决了我的问题。我声明了一个 SteppBloc 类并将当前步骤分配给 0。然后使用 notifyListeners 更新使用它的小部件上的值。

StepBloc 类:

import 'package:flutter/material.dart';

class StepperBloc extends ChangeNotifier 
  int _current = 0;
  int get currentStep => _current;

  set currentStep(int val) 
    _current = val;
    notifyListeners();
  

  increment() 
    _current++;
    notifyListeners();
  

  decrement() 
    _current--;
    notifyListeners();
  

然后我用 StepperBloc 的 ChangeNotifierProvider 包装主 Widget

  @override
  Widget build(BuildContext context) 
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<StepperBloc>.value(value: StepperBloc())
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: theme(),
        home: loading(),
        //initialRoute: SplashScreen.routeName,
        routes: routes,
      ),
    );
  

【讨论】:

以上是关于无法使用颤振 Bloc 模式更新小部件外部的 UI的主要内容,如果未能解决你的问题,请参考以下文章

选择不依赖于状态的正确颤振块小部件

请解释语法 - 使用继承小部件的颤振块提供程序

从非小部件类访问 Flutter Bloc

颤振没有更新肘部状态

颤振:如何使用“等待”等待其他 BLoC 事件完成

颤振计时器仅更新秒小部件