如何在flutter中使用hydated_bloc保持状态?

时间:2020-04-19 04:28:18

标签: flutter bloc

我正在尝试使用hydrated_bloc库保持状态,问题是该库的所有示例都是非常基本的,我想通过使用示例api rest来维护状态,但是我仍然无法实现逻辑这个例子:

userbloc_bloc.dart

import 'dart:async';
import 'package:di/users/model/user.dart';
import 'package:di/users/repository/cloud_api_repository.dart';
import 'package:equatable/equatable.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';

part 'userbloc_event.dart';
part 'userbloc_state.dart';

class UserblocBloc extends HydratedBloc<UserblocEvent, UserblocState> {
  @override
  UserblocState get initialState {
     return super.initialState ?? UserblocInitial();

  }

    @override
  UserblocState fromJson(Map<String, dynamic> json) {
    try {
      final usermodel = UserModel.fromJson(json);
      return UserblocLoaded(usermodel);
    } catch (_) {
      return null;
    }
  }

  @override
  Map<String, dynamic> toJson(UserblocState state) {

    if (state is UserblocLoaded) {
      return state.userModel.toJson();
    }else{
      return null;
    }

  }

  @override
  Stream<UserblocState> mapEventToState(
    UserblocEvent event,
  ) async* {

  }


}

userbloc_state.dart

part of 'userbloc_bloc.dart';


abstract class UserblocState extends Equatable {
  UserblocState([List props = const[]]);
}

class UserblocInitial extends UserblocState {
   CloudApiRepository _cloudApiRepository;
  @override
  List<Object> get props => null;
  Future<UserModel> getlistUser() => _cloudApiRepository.getlistUser();
}

    class UserblocLoading extends UserblocState {
      @override
      Li

st<Object> get props => null;
}
class UserblocLoaded extends UserblocState {
  final UserModel userModel;
  UserblocLoaded(this.userModel);

  @override
  List<Object> get props => null;

}

HomeUser.dart

import 'package:di/users/bloc/userbloc/userbloc_bloc.dart';
import 'package:di/users/model/user.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class HomeUser extends StatefulWidget {
  HomeUser({Key key}) : super(key: key);

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

class _HomeUserState extends State<HomeUser> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
          body: BlocProvider(create: (context) => UserblocBloc(),
          child: BlocBuilder<UserblocBloc, UserblocState>(
            builder: (BuildContext context, UserblocState state) {
              if (state is UserblocInitial) {
                return showanytext();
              } else if (state is UserblocLoading) {
                return buildLoading();
              } else if (state is UserblocLoaded) {
                return buildColumnWithData(state.userModel.data);
              }
            },
          ),
        ),
    );
  }
}

Widget buildColumnWithData(List<User> users){
  final user = users;

  return ListView.builder(
    itemCount: users.length,
    itemBuilder: (BuildContext context, int i){

      return Container(
        padding: EdgeInsets.all(15),
        child: Text("${user[i].firstName}", style: TextStyle(color:Colors.white),),
        decoration: BoxDecoration(
          color: Colors.black
        ),
      );
    });
}
Widget buildLoading(){

  return Center(
    child: Container(
      child: CircularProgressIndicator(),
    ),
  );
}

Widget showanytext(){

  return Center(
    child: Container(
      child: Text("Construyendo el widget"),
    ),
  );
}

关于如何保持使用api的平板电脑状态的一些想法,如果我关闭该应用程序,并在上次关闭她的地方再次打开它,而在离开她的同一位置重新打开它

1 个答案:

答案 0 :(得分:1)

好问题-我有一个非常相似的问题。

简而言之-我的Cubit的状态反映了填写表单并将表单发送到API的阶段:-初始,-开始,-滴答,-已完成和-已发送。

由于无法确定Hydrated Bloc功能应返回哪个状态,因此我实际上是将state属性作为枚举添加到Cubit State中,以反映“最后一次见过” Cubit的状态以及在某些情况下的状态从存储库返回相同的状态。使用它,将提取最后填写的字段。 这听起来像是多余的,但我想不到更好的解决方案。我很高兴听到一些想法:)

这是Cubit的State类声明:

part of 'job_realization_cubit.dart';

enum Status {
  initial,
  started,
  tick,
  completed,
  sent,
}

abstract class JobRealizationState extends Equatable {
  const JobRealizationState({
    this.status,
    this.timeLeft,
    this.jobRealization,
    this.message,
  });
  final Status status;
  final int timeLeft;
  final JobRealization jobRealization;
  final String message;

  @override
  List<Object> get props => [status, timeLeft, jobRealization, message];
}

class JobRealizationInitial extends JobRealizationState {
  const JobRealizationInitial();
}

class JobRealizationStarted extends JobRealizationState {
  const JobRealizationStarted({status, timeLeft, jobRealization, message})
      : super(
          status: status,
          timeLeft: timeLeft,
          jobRealization: jobRealization,
          message: message,
        );
}

//Timekeeping after start of Realization
class JobRealizationTick extends JobRealizationState {
  const JobRealizationTick({status, timeLeft, jobRealization, message})
      : super(
          status: status,
          timeLeft: timeLeft,
          jobRealization: jobRealization,
          message: message,
        );
}


class JobRealizationDone extends JobRealizationState {
  const JobRealizationDone({status, timeLeft, jobRealization, message})
      : super(
          status: status,
          timeLeft: timeLeft,
          jobRealization: jobRealization,
          message: message,
        );
}

class JobRealizationSent extends JobRealizationState {
  const JobRealizationSent({status, timeLeft, jobRealization, message})
      : super(
          status: status,
          timeLeft: timeLeft,
          jobRealization: jobRealization,
          message: message,
        );
}

class JobRealizationSendError extends JobRealizationState {
  const JobRealizationSendError({status, timeLeft, jobRealization, message})
      : super(
          status: status,
          timeLeft: timeLeft,
          jobRealization: jobRealization,
          message: message,
        );
}