[英]How can i call my provider model into initState method
我有幾個小部件使用我的提供者作為條件,我需要一個調用來從 init state 訪問我的提供者到整個小部件,而不是將每個小部件包裝到我的提供者和它的consumer
中
這是我的provider
class ProviderForFiltter extends ChangeNotifier {
bool isFiltterrr = true ;
bool get isFiltter => isFiltterrr;
void changeStatus(bool status){
isFiltterrr = status;
notifyListeners();
}
}
這是我的main.dart
class Myproject extends StatefulWidget {
const Myproject ({Key? key}) : super(key: key);
@override
_Myproject State createState() => _Myproject State();
}
class _Myproject State extends State<Myproject > {
@override
Widget build(BuildContext context) {
return
Provider(
create: (BuildContext context) {
return ProviderForFiltter();
},
child: const MaterialApp(
debugShowCheckedModeBanner: false,
home: WelcomeScreen()
),
),
);
}
}
這是我的Stful
Widget
ProviderForFiltter? isF ;
@override
void initState() {
super.initState();
// i tried this but it always give me errors that is isF null value
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
isF = context.read<ProviderForFiltter>();
});
// also itried this but it don't work
isF = Provider.of<ProviderForFiltter>(context, listen: false);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Text('change'),
)
}
}
事實上我需要使用它的 bool 值作為 Consumer 的條件並改變它
我希望有任何幫助
最好不要在 initState 中使用 Provider,但是你可以使用 Future.delayed 因為你需要上下文
@override
void initState() {
super.initState();
// i tried this but it always give me errors that is isF null value
Future.delayed(Duration(seconds: 1), () {
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
isF = context.read<ProviderForFiltter>();
});
// also itried this but it don't work
isF = Provider.of<ProviderForFiltter>(context, listen: false);
});
}
有多種方法可以解決這個問題。
我使用的第一個選項是添加一個 Post Frame Callback,如下所示:
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
aProvider = Provider.of< aProvider >(context, listen: false);
});
或者,您可以覆蓋 didChangeDependencies 方法以在調用 initState 后獲取提供者值 - 記住將監聽值設置為 false。
providers 需要context ,為了一次性訪問它,你應該覆蓋didChangeDependencies
@override
void didChangeDependencies() {
super.didChangeDependencies();
///access provider here and update your state if needed,
///this will be called one time just before the build method
**isF = Provider.of<ProviderForFiltter>(context, listen: false);**
}
我遇到了同樣的問題,關於提供者的文檔,這應該是答案。
“這很可能發生,因為您在構建小部件樹時正在修改其后代之一的 ChangeNotifier。”
在我的例子中,我正在調用 http api 異步,其中未來存儲在通知程序中。 所以我必須像這樣更新並且它正在工作。
initState() {
super.initState();
Future.microtask(() =>
context.read<MyNotifier>().fetchSomething(someValue);
);
}
最好的方法是像這樣使用(當沒有“外部參數”時。
class MyNotifier with ChangeNotifier {
MyNotifier() {
_fetchSomething();
}
Future<void> _fetchSomething() async {}
}
在調用initState
方法后,您可以使用稱為didChangeDependencies
的不同方法從提供程序獲取值。 另外,確保將listen
值設置為false
。
@override
void didChangeDependencies() {
super.didChangeDependencies();
final filtterData = Provider.of<ProviderForFiltter>(context, listen: false);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.