Как использовать флаттерные крючки с ChangeNotifer

#flutter #hook #flutter-change-notifier

#флаттер #крючок #флаттер-уведомление об изменении

Вопрос:

Предположим, у нас сложная модель с ChangeNotifer , так как я должен автоматически обновлять пользовательский интерфейс при изменении модели?

Вот что я придумал, но выглядит странно, правильно ли это, есть ли лучший способ сделать это?

 class Playground extends HookWidget {
  const Playground({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print("built");

    final dataState = useState(DataClass(0));
    final data = useListenable(dataState.value);

    return Scaffold(
      appBar: AppBar(
        title: Text('Title'),
      ),
      body: ListView(
        children: [
          ListTile(
            title: Text("data: ${data.cnt}"),
            onTap: () {
              data.cnt  ;
            },
          ),
        ],
      ),
    );
  }
}

class DataClass with ChangeNotifier {
  int _cnt;
  int get cnt => _cnt;
  set cnt(int val) {
    _cnt = val;
    notifyListeners();
  }

  DataClass(int cnt) : _cnt = cnt;
}
  

ps: что-то вроде useStateListenable или useListenableProvider

Ответ №1:

вы можете объединить useState и useListenable с чем-то вроде useListenableState

 T useListenableState<T extends ChangeNotifier>(T data) {
  final state = useState<T>(data);
  return useListenable(state.value);
}

class Playground extends HookWidget {
  const Playground({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print("built");

    final data = useListenableState(DataClass(0));

    return Scaffold(
      appBar: AppBar(
        title: Text('Title'),
      ),
      body: ListView(
        children: [
          ListTile(
            title: Text("data: ${data.cnt}"),
            onTap: () {
              data.cnt  ;
            },
          ),
        ],
      ),
    );
  }
}

class DataClass with ChangeNotifier {
  int _cnt;
  int get cnt => _cnt;
  set cnt(int val) {
    _cnt = val;
    notifyListeners();
  }

  DataClass(int cnt) : _cnt = cnt;
}