如何在 flutter 中使用流生成器刷新小部件
How to refresh a widget with stream builder in flutter
我正在尝试根据存储在共享首选项中的数据显示文本文件中的数据我有另一个屏幕可以将数据保存在文本文件中我之前有一个流生成器它是未来的生成器所以我正在尝试刷新从第二个屏幕回来时的屏幕我试图在弹出时调用一个方法该方法在提供者的视图模型调用中被调用但是streambuilder没有得到更新
这是代码
获取数据
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() {}
}
知道如何更新屏幕
每次您的小部件重建时,您都会获得一个新流。这是个错误。您应该只获取一次流(例如,在 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,
否则有一天你可能会收到高昂的后端账单。现在每次屏幕刷新都会对后端进行新查询。
我正在尝试根据存储在共享首选项中的数据显示文本文件中的数据我有另一个屏幕可以将数据保存在文本文件中我之前有一个流生成器它是未来的生成器所以我正在尝试刷新从第二个屏幕回来时的屏幕我试图在弹出时调用一个方法该方法在提供者的视图模型调用中被调用但是streambuilder没有得到更新 这是代码
获取数据
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() {}
}
知道如何更新屏幕
每次您的小部件重建时,您都会获得一个新流。这是个错误。您应该只获取一次流(例如,在 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,
否则有一天你可能会收到高昂的后端账单。现在每次屏幕刷新都会对后端进行新查询。