Flutter:如何在子小部件的构建上下文之外的函数中访问 'provider' 值?

标签 flutter dart provider

提供者值来自父小部件。我可以在构建上下文下使用提供程序值。但是我需要 中的提供者值getHomeCampaigns 功能。我尝试定义局部变量并将它们分配给构建小部件后的提供程序值,但该函数声称这些变量是在 null 上调用的。我想它们是在提供者的构建上下文下设置之前使用的。

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  // Variables to be set inside the function and then used by the last widget
  User currentUser;
  String country;
  List<CampaignWidget> friendsCamps;
  List<CampaignWidget> featuredCamps;

  // Function that needs the provider values
  getHomeCampaigns() async {
    // Get all campaigns where their owner is in the list of friends for the current user
    QuerySnapshot friendsSnapshot = await Firestore.instance
        .collection('campaigns')
        .where('user.uid', whereIn: currentUser.friends)
        .where('attributes.active', isEqualTo: true)
        .orderBy('created', descending: true)
        .limit(20)
        .getDocuments();
    // Get featured campaigns documents in the current country
    QuerySnapshot featuredSnapshot = await Firestore.instance
        .collection('campaigns')
        .where('attributes.featured', isEqualTo: true)
        .where('funders.${currentUser.uid}', isEqualTo: false)
        .where('country', isEqualTo: country)
        .orderBy('user.rating', descending: true)
        .limit(5)
        .getDocuments();
    // Make 2 lists of CampaignWidget out of the documents retrieved
    List<CampaignWidget> campaigns = friendsSnapshot.documents
        .map((doc) => CampaignWidget(campaign: Campaign.fromDocument(doc)))
        .toList();
    List<CampaignWidget> featured = featuredSnapshot.documents
        .map((doc) => CampaignWidget(campaign: Campaign.fromDocument(doc)))
        .toList();
    setState(() {
      // Set the featured and friends lists of CampaignWidget to the newly made lists
      this.featuredCamps = featured;
      this.friendsCamps = campaigns;
    });
  }

  @override
  void initState() {
    super.initState();
    getHomeCampaigns();
  }

  @override
  Widget build(BuildContext context) {
    this.currentUser = Provider.of<User>(context);
    this.country = Provider.of<String>(context);
    return Scaffold(
      backgroundColor: Color(0xFFE8E8E8),
      appBar: AppBar(
        centerTitle: false,
        title: Text("Home"),
        actions: <Widget>[
          /// Search users
          IconButton(
            icon: Icon(
              Icons.search,
            ),
            onPressed: () {},
          ),
        ],
      ),
      body: RefreshIndicator(
        onRefresh: () => getHomeCampaigns(),
        child: // Some widget that uses the variables,
      ),
    );
  }
}

最佳答案

您可以像这样从提供程序读取变量:Provider.of(context, listen: false).yourVariablegetHomeCampaigns .您必须拥有 listen: false但是要让它起作用,因为它不在小部件树中,因此它无法在 yourVariable 时更新变化——见。如果这不起作用,那么您声明提供者的地方就会出现问题。如果这有效,请投票并接受作为答案,否则请在下方评论。

关于Flutter:如何在子小部件的构建上下文之外的函数中访问 'provider' 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61447656/

相关文章:

android - 如何更改 Flutter DevTools 默认浏览器?

flutter - 无法将键和 bool 值添加到嵌套列表中

flutter - 从 Selector 访问多个字段(在 Flutter 中使用 Provider 状态管理时)?

Flutter - 使用相同的提供者更新下拉列表并将数据发送到另一个小部件

android - 如何在一张图表中显示三个数据? ( flutter/fl_chart)

flutter - 如何在flutter中连续改变背景

flutter - 如何在DateTime中删除不必要的数字

firebase - flutter async 同步编程

Android:保持与应用程序相关的本地文件的最新记录

dart - Flutter SharedPreference 不持久