首页 > 解决方案 > 在自定义类颤振中使用提供者

问题描述

我正在创建一个需要使用 Provider 来获取值的程序。我在有状态的小部件中调用我的提供程序,如下所示

final user = Provider.of<Users>(context);

现在我想在自定义类中使用提供者

class UserInformation {
    final user = Provider.of<Users>(context):
}

这不起作用,因为没有定义上下文。请协助我如何在不使用BuildContext.

这是我在单独的 dart 文件中拥有的类用户,并用作我的数据流的模型。

class Users {
  final String uid;
  final String name;
  final String department;
  final String position;

  Users({ this.uid, this.department, this.name, this.position });
}

这是我用来从 Firestore 中提取数据的查询

Stream<List<FormQuestions>> get userData{
  return userCollection.where('name', isEqualTo: 'First Name').where('department', isEqualTo: 'department').snapshots()
  .map(_userDataFromSnapshot);
}

我希望该名称是我从模型类中获得的变量(user.name)。部门也是如此。

谢谢。

标签: flutterdart

解决方案


您只能访问ChangeNotifiers位于此提供的树下方的后代小部件中的类,ChangeNotifier因为在幕后Provider使用InheritedWidget(使用context)为您提供您ChangeNotifier在树中放置的

因此,在您的情况下,无法访问Usersfrom UserInformation,您必须更改代码以解决问题

编辑:如果您在小部件中使用此代码,这是实现您想要的目标的建议:

class UserInformation{
  final User user;

  UserInformation(this.user);
}

class SomeWidget extends StatefulWidget {
  @override
  _SomeWidgetState createState() => _SomeWidgetState();
}

class _SomeWidgetState extends State<SomeWidget> {

  void someMethod(){
    final User user = Provider.of<Users>(context);
    UserInformation userInformation = UserInformation(user);
    //do something
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

推荐阅读