简体   繁体   English

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

[英]Widget is not display with onPressed event of RaisedButton

I am trying to show CircularProgressIndicator while calling API with dio & BLoC pattern.我试图在使用 dio & BLoC 模式调用 API 时显示CircularProgressIndicator

Here is the code :这是代码:

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"),
      ],
    ));
  }

When i click on button it hits the url and get the data but it is not showing CircularProgressIndicator .当我点击按钮时,它会点击 url 并获取数据,但它没有显示CircularProgressIndicator But if i write bloc.getUser();但是如果我写bloc.getUser(); in initState() then it show the loading.在 initState() 然后它显示加载。 But i want to get the loading after click on button.但我想在点击按钮后加载。

BLoC class : 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();
  }
}

I am getting data from API but only problem is for showing loading progress.我正在从 API 获取数据,但唯一的问题是显示加载进度。

Your RaisedButton onPress() will never open a widget.您的 RaisedButton onPress() 永远不会打开小部件。

Because, onPress() is a method used to handle or your data processing, events and functions.因为,onPress() 是一种用于处理或您的数据处理、事件和函数的方法。

onPress() is not expecting or looking for a Widget to render on the screen. onPress() 不期望或寻找在屏幕上呈现的小部件。 onPress() is a function not a Structure or Widget. onPress() 是一个函数,而不是结构或小部件。

In your case, bloc.getUser();在你的情况下, bloc.getUser(); is okay as it is a function.没关系,因为它是一个函数。 But you have already written a StreamBuilder Widget inside a function.但是您已经在函数中编写了一个 StreamBuilder 小部件。 Which should not be added inside the function.不应该在函数内部添加。

Place it inside your build method and you will be able to view/render it on your screen.将它放在您的构建方法中,您将能够在屏幕上查看/渲染它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM