首页 > 解决方案 > 流控制器未注册接收器事件颤动

问题描述

我正在使用 bloc 模式来处理我的应用程序中的状态。但是,将数据下沉到我的流中不起作用。如果文本字段为空,我有一个formfield返回 null 的按钮。这是我的集团

class SavingsCategoryBloc {
    final amount = PublishSubject<int>();

    Stream<int> get amountStream => amount.stream;
    Function(int) get amountSink => amount.sink.add;
}

这是我的屏幕

class _StartSavingPageState extends State<StartSavingPage> {
    final SavingsCategoryBloc bloc = SavingsCategoryBloc();
    ...


    @override
    Widget build(BuildContext context) {
    ...
     Container(
             padding: EdgeInsets.symmetric(
             horizontal: 15.0, vertical: 15.0),
             child: TextField(
             onChanged: (String value) => bloc.amountSink,
                 keyboardType: TextInputType.number,
                 controller: amountController,
                 decoration: InputDecoration(
                    labelText: 'AMOUNT TO SAVE ',
                    labelStyle: TextStyle(
                    fontFamily: 'Montserrat',
                    fontSize: 2.1 * SizeConfig.textMultiplier,
                    color: Colors.grey),
                    focusedBorder: UnderlineInputBorder(
                       borderSide:
                        BorderSide(color: Colors.purple))),
                      ),
                    ),

                 ....

                Container(
                      padding: EdgeInsets.symmetric(
                          horizontal: 15.0, vertical: 15.0),
                      decoration: BoxDecoration(
                          borderRadius:
                              BorderRadius.all(Radius.circular(25.0))),
                      width: double.infinity,
                      child: StreamBuilder(
                          stream: bloc.amountStream,
                          builder: (context, snapshot) {
                            return RaisedButton(
                              elevation: 5.0,
                              onPressed: snapshot.hasData
                                  ? () => print('hi')
                                  : null,
                              padding: EdgeInsets.all(15.0),
                              color: Colors.purple,
                              child: Text(
                                'SAVE',
                                style: TextStyle(
                                  color: Colors.white,
                                  letterSpacing: 1.5,
                                  fontSize: 18.0,
                                  fontWeight: FontWeight.bold,
                                  fontFamily: 'OpenSans',
                                ),
                              ),
                            );
                          }),
                    )

即使formfield不为空,该按钮仍保持禁用状态。

标签: flutter

解决方案


您没有在流中添加数据,也没有使用streamcontroller

以下示例清除您的想法。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/subjects.dart';

class SavingsCategoryBloc {
  final _counterController = PublishSubject<int>();

  Stream<int> get amountStream => _counterController.stream;
  Sink<int> get amountSink => _counterController.sink;

  dispose() {
    _counterController.close();
  }
}

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(body: HomeWidget()),
    );
  }
}

class HomeWidget extends StatefulWidget {
  const HomeWidget({Key key}) : super(key: key);

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

class _HomeWidgetState extends State<HomeWidget> {
  SavingsCategoryBloc bloc = SavingsCategoryBloc();

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          TextField(
            onChanged: (String value) => bloc.amountSink.add(int.parse(value)),
            keyboardType: TextInputType.number,
            decoration: InputDecoration(
                labelText: 'AMOUNT TO SAVE ',
                labelStyle:
                    TextStyle(fontFamily: 'Montserrat', color: Colors.grey),
                focusedBorder: UnderlineInputBorder(
                    borderSide: BorderSide(color: Colors.purple))),
          ),
          SizedBox(
            height: 20,
          ),
          Container(
            padding: EdgeInsets.symmetric(horizontal: 15.0, vertical: 15.0),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.all(Radius.circular(25.0))),
            width: double.infinity,
            child: StreamBuilder(
                stream: bloc.amountStream,
                //    initialData: "",
                builder: (context, snapshot) {
                  return RaisedButton(
                    elevation: 5.0,
                    onPressed: snapshot.hasData ? () => print('hi') : null,
                    padding: EdgeInsets.all(15.0),
                    color: Colors.purple,
                    child: Text(
                      'SAVE',
                      style: TextStyle(
                        color: Colors.white,
                        letterSpacing: 1.5,
                        fontSize: 18.0,
                        fontWeight: FontWeight.bold,
                        fontFamily: 'OpenSans',
                      ),
                    ),
                  );
                }),
          )
        ],
      ),
    );
  }
}

推荐阅读