如何在没有上下文的情况下访问提供商 [英] How to Access Provider with out Context in Flutter

查看:16
本文介绍了如何在没有上下文的情况下访问提供商的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了颤动提供程序模式的问题,我需要从没有上下文的类访问提供的内容。

提供商:

import 'package:flutter/foundation.dart';
class TokenProvider with ChangeNotifier {
  TokenService tokenService = TokenService();
  String _accessToken = '';

  String get accessToken {
    return _accessToken;
  }

  dynamic setAccessToken(data) async {

    _accessToken = data;

  }
}

类:


import '../constants/constants.dart';
import '../models/models.dart';
import './network-call/base-service.dart';

class TokenService extends BaseService {
  Future<String> getToken() async {
    final dynamic response = await serviceCall(
        url: ApiName().apiName(api: ServiceName.TOKEN),
        method: ApiMethod.POST,
        queryParameters: {
          'id': Preferences().env['id'],
          'secret': Preferences().env['secret'],
          'type': 'rrrr'
        });
Need to set this responce Data in Providers
  }

}

谢谢。

推荐答案

我用来在需要的时候传递上下文,正如Dlohani在问题的评论中所建议的那样,但我发现自己也处于同样的情况,并应用了一个受到隔离之间使用的通信模式启发的解决方案:消息交换。

提供者类需要有一个ReceiverPort字段来侦听请求消息。当消息到达此侦听器时,您位于提供程序内部,因此您可以再次以ReceiverPort的方式检索数据并将其发回,即使用请求类中注册的ReceiverPort的sendPort。

在下面的代码中,我认为消息Map是为了阐明交换的数据类型:

class SomeProvider with ChangeNotifier {
  var _innerData = yourData;
  var _providerReceiverPort = ReceiverPort();

  SomeProvider() {
    // The registration is necessary to "publish" the receiver port 
    IsolateNameServer.registerPortWithName(
      _providerReceiverPort, "SomeProviderPort");

    _providerReceiverPort.listen(
      (message) {
        // I retrieve the port to send the response to
        var port = message["sendPort"];
        // The answer follows the rules of messaging: maps and lists are ok
        port.send({"data": _innerData.getSomething()});
      }
    );
  }
}

class SomeClient {
  var _clientReceiverPort = ReceiverPort();
  
  someFunction(){
    // First step: prepare the receiver to obtain data
    _clientReceiverPort.listen(
      (message) {
        // Data are stored in the map containing a "data" key
        var response = message["data"];
        ...
      }
    );

    // Now I can retrieve the provider port by using the same name it uses to publish it
    var providerPort = IsolateNameServer.lookupPortByName("SomeProviderPort");
    // The message must include the sendPort to permit the provider to address the response
    providerPort.send({"sendPort": _clientReceiverPort.sendPort});
  }
}

此解决方案的缺点是提供程序不能作为SomeClient类的提供程序工作。显然,如果监听器中的任何更改对订阅者很重要,您都可以进行通知:例如,我使用此模式从后台隔离更新提供者中的数据。

正如我所说,这是一种解决办法,欢迎提出任何改进建议。

这篇关于如何在没有上下文的情况下访问提供商的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆