Riverpod не перестраивает пользовательский интерфейс

#android #ios #flutter #dart #riverpod

Вопрос:

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

Именно здесь я использую виджет потребителя :

 
    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))))
        ]));
      }
    }

 

Это определитель состояния :

 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);
  }
}

 

Ответ №1:

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

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

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

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

Комментарии:

1. Скоро я буду снимать этот фильм на экране!