簡體   English   中英

如何在 flutter 中使用 Provider 初始化數據

[英]How do I initialize data with the Provider in flutter

這是代碼:

主要的

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Something>(
      create: (_) => Something(),
      child: Consumer<Something>(
        builder: (BuildContext context, Something value, Widget child) {
          return MaterialApp(
            title: 'Flutter Demo',
            home: MyHomePage(),
          );
        },
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>  {
  String mockData = '';

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'moceData:$mockData',
            ),
            Text(
              '${Provider.of<Something>(context).count}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(context, MaterialPageRoute(builder: (_) {
            return SecondPage();
          }));
        },
        child: Icon(Icons.add),
      ),
    );
  }

  initData() {
    Future.delayed(Duration(seconds: 1), () {
      mockData = 'mock 123';
      setState(() {});
    });
  }
}

第二頁

class SecondPage extends StatefulWidget {
  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(
          child: GestureDetector(
            onTap: () {
              Provider.of<Something>(context, listen: false).doSomething();
            },
            child: Text('click'),
          ),
        ),
      ),
    );
  }
}

某物

class Something extends ChangeNotifier {
  
  var count =0;
  void doSomething() {
    print('doSomething');
    count++;
    notifyListeners();

  }
}

當我們打開這個應用時,MyHomePage 在 initState 中請求數據, 在此處輸入圖像描述

在此處輸入圖像描述

當我們推送 secondPage 時,我們點擊 'click' btn,我們希望第一頁檢索數據(iniData())。

當我們點擊時,notifiyListeners()和_MyHomePageState build()被調用了,但是initState()沒有,所以

怎么辦?我們可以再次調用initData。

類似情況: 1.我們更改了其他頁面的語言。 主頁上的數據需要重新請求響應的語言界面。 2.用戶登錄成功后,刷新用戶庫存,庫存頁面已經存在

嘗試這個:

setState(() {
mockData = 'mock 123';
});

但是在這里,您並沒有初始化數據以將其與 Provider 一起使用,如果您希望使用 Provider 獲取數據(我的意思是 mockData var),您可以這樣做:

在 class 中添加以下內容:

String mockData="123";
String get mockdata => mockData;

然后在 HomePage 中使用 Provider 訪問這些數據:

Provider.of<Something>(context, listen:false).mockdata;

我希望我能幫助你..祝你好運!

抱歉,可能是我描述的問題不夠清楚,不過我現在已經找到了解決辦法。 利用

ChangeNotifierProxyProvider<Foo, MyChangeNotifier>(
  create: (_) => MyChangeNotifier(),
   update: (_, foo, myNotifier) => myNotifier
     ..foo = foo,
   child: ...
 );

/// 一個 [ChangeNotifierProvider],它根據從其他提供者獲得的值構建和同步 [ChangeNotifier] ///。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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