窗口小部件不与RaisedButton的onPressed事件一起显示

时间:2019-12-11 09:43:05

标签: flutter dart bloc dio

我正在尝试使用dio&BLoC模式调用API时显示CircularProgressIndicator

这是代码:

class UserWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _UserWidgetState();
  }
}

class _UserWidgetState extends State<UserWidget> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        margin: EdgeInsets.only(top: 200),
        child: RaisedButton(
          child: Text("Click"),
          onPressed: () {
            bloc.getUser();
            StreamBuilder<MemberLogin>(
              stream: bloc.subject.stream,
              builder: (context, AsyncSnapshot<MemberLogin> snapshot) {
                if (snapshot.hasData) {
                  return _buildUserWidget(snapshot.data);
                } else if (snapshot.hasError) {
                  return _buildErrorWidget(snapshot.error);
                } else {
                  return _buildLoadingWidget();
                }
              },
            );
          },
        ),
      ),
    );
  }

 Widget _buildLoadingWidget() {
    return Center(
      child: CircularProgressIndicator(),
    );
  }

  Widget _buildErrorWidget(String error) {
    return Center(
        child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("Error occured: $error"),
      ],
    ));
  }

  Widget _buildUserWidget(MemberLogin data) {
    return Center(
        child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("User widget"),
      ],
    ));
  }

当我单击按钮时,它会到达URL并获取数据,但未显示CircularProgressIndicator。 但是,如果我在initState()中写入bloc.getUser();,则会显示正在加载。但是我想在单击按钮后得到负载。

BLoC类别:

class UserBloc {
  final UserRepository _repository = UserRepository();
  final BehaviorSubject<MemberLogin> _subject = BehaviorSubject<MemberLogin>();

  getUser() async {
    MemberLogin response = await _repository.getUser();
    _subject.sink.add(response);
  }

  dispose() {
    _subject.close();
  }

  BehaviorSubject<MemberLogin> get subject => _subject;
}

final bloc = UserBloc();


class UserRepository{
  MemberApiProvider _apiProvider = MemberApiProvider();

  Future<MemberLogin> getUser(){
    return _apiProvider.getUser();
  }
}

我正在从API获取数据,但是唯一的问题是显示加载进度。

1 个答案:

答案 0 :(得分:0)

您的RaisedButton onPress()将永远不会打开小部件。

因为onPress()是一种用于处理或处理数据,事件和功能的方法。

onPress()不需要或正在寻找要在屏幕上呈现的窗口小部件。 onPress()是一个函数,而不是Structure或Widget。

对于您而言, bloc.getUser(); 可以,因为它是一个函数。但是您已经在函数内部编写了StreamBuilder Widget。不应在函数中添加哪个。

将其放在您的构建方法中,您将可以在屏幕上查看/呈现它。