0

我试图在CircularProgressIndicator使用 dio 和 BLoC 模式调用 API 时显示。

这是代码:

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。但是如果我bloc.getUser();在 initState() 中写入,那么它会显示加载。但我想在点击按钮后加载。

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 获取数据,但唯一的问题是显示加载进度。

4

1 回答 1

0

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

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

onPress() 不期待或寻找要在屏幕上呈现的小部件。onPress() 是一个函数,而不是结构或小部件。

在您的情况下,bloc.getUser(); 没关系,因为它是一个函数。但是您已经在函数中编写了 StreamBuilder Widget。不应该在函数内部添加。

将它放在您的构建方法中,您将能够在屏幕上查看/渲染它。

于 2019-12-11T09:51:12.653 回答