#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. Скоро я буду снимать этот фильм на экране!