Riverpod не перестраивает интерфейс

Consumer Widget не перестраивается, когда я ввожу новые элементы в текстовые поля, как я могу решить эту проблему? (Я могу видеть новые элементы только при горячем перезапуске)

Вот где я использую потребительский виджет:


    import 'package:flutter/material.dart';
    import 'package:flutter_riverpod/flutter_riverpod.dart';
    import 'package:riverpodtx/providers/txprovider.dart';
    
    final transactionProvider = StateNotifierProvider((ref) => TxState());
    
    class CurrTx extends ConsumerWidget {
      //Current transaction List
      @override
      Widget build(BuildContext context, ScopedReader watch) {
        final txList = watch(transactionProvider.state);
        return Container(
            height: 240,
            margin: EdgeInsets.only(top: 15),
            child: ListView(
              children: txList.map((e) {
                return ListTile(
                  tileColor: Colors.pink,
                  title: Text(e.title),
                  leading: Text(e.price),
                );
              }).toList(),
            ));
      }
    }

Здесь я использовал кнопку отправки, чтобы добавить новые элементы:

    
    class NewTx extends StatelessWidget {
      final TextEditingController titleController = TextEditingController(text: '');
      final TextEditingController priceController = TextEditingController(text: '');
    
      @override
      Widget build(BuildContext context) {
        return Container(
            child:
                Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
          TextField(
            controller: titleController,
            decoration: InputDecoration(labelText: 'Title'),
          ),
          TextField(
            decoration: InputDecoration(labelText: 'Price'),
            controller: priceController,
            keyboardType: TextInputType.number,
          ),
          Container(
              alignment: AlignmentDirectional.bottomEnd,
              child: IconButton(
                  icon: Icon(Icons.add),
                  onPressed: () => context.read(transactionProvider).addTx(
                      Transaction(titleController.text, priceController.text))))
        ]));
      }
    }

Это StateNotifier:

import 'package:riverpodtx/models/transaction.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class TxState extends StateNotifier<List<Transaction>> {
  TxState([List<Transaction>? _transaction]) : super(_transaction ?? []);
  void addTx(Transaction tx) {
    state.add(tx);
  }
}


person sweCB    schedule 31.03.2021    source источник


Ответы (1)


Чтобы StateNotifier инициировал обновление состояния, вы должны фактически обновить объект состояния.

То есть состояние должно быть заменено чем-то, что не равно старому значению, оцененному оператором равенства ==, чтобы инициировать уведомления для его слушателей.

Вместо использования List.add попробуйте создать новый список с помощью оператора распространения ...:

class TxState extends StateNotifier<List<Transaction>> {
  TxState([List<Transaction>? _transaction]) : super(_transaction ?? []);
  void addTx(Transaction tx) {
    state = [...state, tx];
  }
}
person Alex Hartford    schedule 31.03.2021
comment
Я скоро сделаю снимок экрана! - person Randal Schwartz; 01.04.2021