簡體   English   中英

我如何將我的提供者 model 調用到 initState 方法中

[英]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 {}
}

來源: https://pub.dev/packages/provider

在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM