【问题标题】:Flutter: UI reactions with ProviderFlutter:与 Provider 的 UI 反应
【发布时间】:2020-10-10 16:43:09
【问题描述】:
  1. 在某些事件中,我想使用 Navigator 导航到另一个屏幕。 我可以使用 BlocListener 轻松实现:
  BlocListener<BlocA, BlocAState>(
  bloc: blocA,
  listener: (context, state) {
      if (state is Success) {              
          Navigator.of(context).pushNamed('/details');
      }  
  },
  child: Container(),
)

但我无法在纯 Provider 中找到它的直接等价物。 我看到的唯一方法是交换屏幕:

home: Consumer<Auth>(
    builder: (_, auth, __) => auth.user == null ? LoginPage() : MainPage()
)

这是一种常见的方式。但它不会使用 Navigator,因此它只会“弹出”MainPage 而没有屏幕转换。

  1. 在某些事件中,我想在 UI 中播放一些动画。

我在文档中发现Listenable 类是用来处理动画的,但没有详细解释。

  1. 在某些情况下,我想清除 TextEditingController。

  2. 在某些事件中,我想显示一个对话框。

还有更多类似的任务... 如何解决?提前致谢!

【问题讨论】:

    标签: flutter dart provider


    【解决方案1】:

    经过一番研究,我找到了一种方法。我不确定这是否是唯一或最好的方式,或者 Provider 的创建者预见的方式,但它确实有效。

    这个想法是在我的 Store 类(我的意思是由 Provider 提供的业务逻辑类)中保留一个助手 Stream,并在我的小部件中订阅它的更改。

    所以在我的商店课程中,我有:

      final _eventStream = StreamController.broadcast();
      Stream get eventStream => _eventStream.stream;
      
      void dispose() {
        _eventStream.close();
        super.dispose();
      }
    

    我在动作中向这个流添加事件:

      void navigateToNextScreen() {    
        _eventStream.sink.add('nav');
      }
    
      void openDialog() {    
        _eventStream.sink.add('dialog');
      }
    

    在我的 UI 小部件中,我有:

      @override
      void afterFirstLayout(BuildContext context) {
        context.read<Transactions>().eventStream.listen((event) {
          if (event == 'nav') {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (ctx) => SecondScreen(),
              ),
            );
          } else if (event == 'dialog') {
            showDialog(
                context: context,
                builder: (context) => AlertDialog(content: Text("Meow")));
          }
        });    
      }
    

    我在这里使用了after_layout 包中的afterFirstLayout 生命周期方法,它只是WidgetsBinding.instance.addPostFrameCallback 的包装器


    07.07.20 UPD.:刚刚找到一个可以用于事件反应的包: https://pub.dev/packages/event_bus

    它基本上使用与引擎盖下的 StreamController 相同的方法。

    【讨论】:

    • @RémiRousselet 你怎么看?这是一个好的解决方案吗?
    猜你喜欢
    • 2020-07-19
    • 2020-06-27
    • 2020-11-06
    • 2022-10-06
    • 1970-01-01
    • 2020-09-18
    • 2020-12-30
    • 1970-01-01
    • 2022-08-12
    相关资源
    最近更新 更多