簡體   English   中英

Flutter Riverpod:StateNotifier 未重新渲染小部件

[英]Flutter Riverpod: StateNotifier not rerendering widget

我有一個簡單的 StateNotifier class ,如下所示:

class MyClass extends StateNotifier<Map<String, dynamic>> {
  Map<String, dynamic> data;

  MyClass({this.data}) : super(null) {
    data = data ?? {};
  }

  setData(Map<String, dynamic> newData) {
    data = {...data, ...newData};
  }
}

我在 providers.dart 文件中定義了我的提供程序:

final myClassProvider = StateNotifierProvider((ref) => _myClass);

...我正在導入並嘗試在我的小部件的內部“讀取”並在 MyClass 的build更改時更新小部件:

MyClass _myClass = ref.watch(myClassProvider.notifier);

我有幾個按鈕調用setData方法,我可以看到它獲取的是新數據,但我的小部件永遠不會重新呈現。 如果我導航回一個屏幕,然后再次前進到同一個視圖,我可以看到它已使用新數據進行了更新,但我的小部件永遠不會在它發生時重新呈現。 我在這里做一些根本錯誤的事情嗎?

StateNotifier有自己的state

class MyClass extends StateNotifier<Map<String, dynamic>> {

  MyClass(Map<String, dynamic> data) : super(data);

  setData(Map<String, dynamic> newData) {
    state = {...state, ...newData};
  }
}

我們可以使用 Riverpod 從 Map 獲取數據,如下所示:-

  final dataValue = ref.watch(counterProvider);
    String name = dataValue['name'].toString();
    String email = dataValue['email'].toString();
    String address = dataValue['address'].toString();

並在不同的文本上設置這些值。

我們應該像這樣傳遞和設置 Map<String,dynamic> 中的值:-

final counterProvider =
    StateNotifierProvider<Counter, Map<String, dynamic>>((_) => Counter());

class Counter extends StateNotifier<Map<String, dynamic>> {
  // Counter(Map<String, dynamic> data): super(data);
  Counter() : super({});

  void displayFile(String name, String email, String address) {
    Map<String, dynamic> cartMap = {"name": name, "email": email, "address": address};

    state = {...state, ...cartMap};
  }
}

暫無
暫無

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

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