如何在颤动中使用流构建器刷新小部件

Posted

技术标签:

【中文标题】如何在颤动中使用流构建器刷新小部件【英文标题】:How to refresh a widget with stream builder in flutter 【发布时间】:2021-11-20 07:03:29 【问题描述】:

我正在尝试根据存储在共享首选项中的数据显示文本文件中的数据我有另一个屏幕可以将数据保存在文本文件中我之前有一个流构建器它是未来的构建器所以我正在尝试刷新屏幕当从第二个屏幕回来时,我试图在弹出时调用一个方法,该方法在提供者的视图模型类中被调用,但流构建器没有得到更新 这是代码

获取数据

Future<List<String>> fetchdata() async 
SharedPreferences prefs = await SharedPreferences.getInstance();
String? category = prefs.getString('category');
if (category != null) 
  lines = await locator<JsonAPI>().fetchquotes(category);
 else 
  lines = await locator<JsonAPI>().fetchquotes('quotes');

// data = lines as Future<List<String>>;
notifyListeners();
return lines;

流生成器

         var quotesdata = Provider.of<HomeViewModel>(context, listen: false);

 StreamBuilder(
              stream: quotesdata.fetchdata().asStream(),
              builder: (context, AsyncSnapshot snapshot) 
                if (snapshot.hasData) 
                  List<String> lines = quotesdata.lines;
                  // List<String>? lines = snapshot.data as List<String>?;
                  return ScreenShotWidget(
                    homeViewModel: quotesdata,
                    list: lines,
                  );
                 else 
                  return Container();
                
              ),

弹出时我调用的方法

function(data) 
category = data.toString();
fetchdata();
notifyListeners();
setState() 

知道如何更新屏幕

【问题讨论】:

你能指定quotesdata是什么以及它是在哪里创建的吗? quotesdata 是视图模型类的对象 @Lulupointu 更新了问题 【参考方案1】:

每次您的小部件重建时,您都会获得一个新的流。这是个错误。您应该只获取一次流(例如,在 initState 中)

@override
void initState() 
  _stream = quotesdata.fetchdata().asStream();

并将该流变量与StreamBuilder一起使用

 StreamBuilder(
   stream: _stream,

稍后,当您想要更新流时,您可以这样做

setState(() 
  _stream = quotesdata.fetchdata().asStream();
) 

更改流并强制刷新。

请检查您的代码并更改所有此类用法

 StreamBuilder(
   stream: quotesdata.fetchdata().asStream(),

这种用法。

 StreamBuilder(
   stream: _stream,

否则有一天您可能会收到高额的后端账单。现在每次屏幕刷新都会对后端进行一次新查询。

【讨论】:

但quotesdata 是一个提供者对象,我如何在初始化之前使用它?? 这里有一些方法:***.com/questions/60343605/… 另一种方法是让父级获取它并将其传递给这个小部件的构造函数。 您不能在构建函数中调用 fetchdata()。 嘿只是一个问题,当我弹出第二个屏幕时,这种方法是否会自动刷新?我必须在函数中设置状态方法 您的意思是,在您通过流显示此屏幕后,您会显示第二个屏幕,当您返回此屏幕时,您希望刷新此屏幕?

以上是关于如何在颤动中使用流构建器刷新小部件的主要内容,如果未能解决你的问题,请参考以下文章

在小部件构建期间如何在颤动中导航?

如何在颤动中更改容器小部件中的背景图像

颤动中非动态容器小部件的水平轮播

在颤动中显示全屏加载小部件

如何在颤动的pageView中使用AnimatedCrossFade多个小部件?

如何在颤动中加载主小部件之前显示加载小部件?