Flutter 颤振Riverpod:如何实现FutureProvider?

Flutter 颤振Riverpod:如何实现FutureProvider?,flutter,riverpod,Flutter,Riverpod,我使用包来处理http请求。我有一个简单的Httpget请求来显示服务器上的所有用户,我使用包中的FutureProvider来管理它 美国石油学会 若http请求并没有必需的参数并没有问题,但若我的http请求需要参数,那个么我就遇到了问题。我不知道怎么处理这件事 比方说,我有另一个httpget来显示id用户或电子邮件用户的特定用户。那么API看起来像: 美国石油学会 当我使用usrProvider.state.idUser从userProvider访问idUser时,我收到了此警告。 成员

我使用包来处理http请求。我有一个简单的Httpget请求来显示服务器上的所有用户,我使用包中的FutureProvider来管理它

美国石油学会 若http请求并没有必需的参数并没有问题,但若我的http请求需要参数,那个么我就遇到了问题。我不知道怎么处理这件事

比方说,我有另一个httpget来显示id用户或电子邮件用户的特定用户。那么API看起来像:

美国石油学会 当我使用
usrProvider.state.idUser
从userProvider访问idUser时,我收到了此警告。
成员“state”只能在“package:state\u notifier/state\u notifier.dart”子类的实例成员中使用。


我在上的问题也有类似的问题,但在这个问题上,我已经知道使用
read(userProvider.state)
可以解决,但是在未来的provider中,我无法使用
ref(userProvider)
获得相同的结果


我错过了什么?警告:这不是一个长期的解决方案

假设您的FutureProvider在每次使用后都得到妥善处置,这应该是一个合适的解决办法,直到Riverpod的新更改生效。我做了一个快速的测试,看看它的工作。确保像这样定义一个getter,并且不要覆盖StateNotifier定义的默认值

A类扩展状态通知程序{
...
静态最终提供程序=StateNotifierProvider((ref)=>A());
getState()=>状态;
...
}
final provider=FutureProvider.autoDispose((ref)异步{
最终a=参考读数(a.供应商);
最终t=a.getState();
打印(t);
});
不理想,但似乎是一个很好的解决办法。我相信状态在外部不可访问的目的是确保状态操纵由StateNotifier本身处理,因此在此期间使用getter不会是世界末日

class UserGoogleApi {
  Future<List<UserGoogleModel>> getAllUser() async {
    final result = await reusableRequestServer.requestServer(() async {
      final response =
          await http.get('${appConfig.baseApiUrl}/${appConfig.userGoogleController}/getAllUser');
      final Map<String, dynamic> responseJson = json.decode(response.body);
      if (responseJson['status'] == 'ok') {
        final List list = responseJson['data'];
        final listUser = list.map((e) => UserGoogleModel.fromJson(e)).toList();
        return listUser;
      } else {
        throw responseJson['message'];
      }
    });
    return result;
  }
}
class UserProvider extends StateNotifier<UserGoogleModel> {
  UserProvider([UserGoogleModel state]) : super(UserGoogleModel());
   
Future<UserGoogleModel> searchUserByIdOrEmail({
    String idUser,
    String emailuser,
    String idOrEmail = 'email_user',
  }) async {
    final result = await _userGoogleApi.getUserByIdOrEmail(
      idUser: idUser,
      emailUser: emailuser,
      idOrEmail: idOrEmail,
    );
    UserGoogleModel temp;
    for (var item in result) {
      temp = item;
    }
    state = UserGoogleModel(
      idUser: temp.idUser,
      createdDate: temp.createdDate,
      emailUser: temp.emailUser,
      imageUser: temp.emailUser,
      nameUser: temp.nameUser,
      tokenFcm: temp.tokenFcm,
      listUser: state.listUser,
    );

    return temp;
  }

  Future<List<UserGoogleModel>> showAllUser() async {
    final result = await _userGoogleApi.getAllUser();
    state.listUser = result;
    return result;
  }
}

final userProvider = StateNotifierProvider((ref) => UserProvider());

final showAllUser = FutureProvider.autoDispose((ref) async {
  final usrProvider = ref.read(userProvider);
  final result = await usrProvider.showAllUser();
  return result;
});
    Consumer((ctx, read) {
              final provider = read(showAllUser);
              return provider.when(
                data: (value) {
                  return ListView.builder(
                    itemCount: value.length,
                    shrinkWrap: true,
                    itemBuilder: (BuildContext context, int index) {
                      final result = value[index];
                      return Text(result.nameUser);
                    },
                  );
                },
                loading: () => const CircularProgressIndicator(),
                error: (error, stackTrace) => Text('Error $error'),
              );
            }),
  Future<List<UserGoogleModel>> getUserByIdOrEmail({
    @required String idUser,
    @required String emailUser,
    @required String idOrEmail,
  }) async {
    final result = await reusableRequestServer.requestServer(() async {
      final baseUrl =
          '${appConfig.baseApiUrl}/${appConfig.userGoogleController}/getUserByIdOrEmail';
      final chooseURL = idOrEmail == 'id_user'
          ? '$baseUrl?id_or_email=$idOrEmail&id_user=$idUser'
          : '$baseUrl?id_or_email=$idOrEmail&email_user=$emailUser';
      final response = await http.get(chooseURL);
      final Map<String, dynamic> responseJson = json.decode(response.body);
      if (responseJson['status'] == 'ok') {
        final List list = responseJson['data'];
        final listUser = list.map((e) => UserGoogleModel.fromJson(e)).toList();
        return listUser;
      } else {
        throw responseJson['message'];
      }
    });
    return result;
  }
final showSpecificUser = FutureProvider.autoDispose((ref) async {
  final usrProvider = ref.read(userProvider);

  final result = await usrProvider.searchUserByIdOrEmail(
    idOrEmail: 'id_user',
    idUser: usrProvider.state.idUser, //  => warning on "state"
  );
  return result;
});