当我在textfields上输入新项目时,使用者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(),
));
}
}
这就是我使用submit按钮添加新项的地方:
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);
}
}
发布于 2021-03-31 17:45:37
要使StateNotifier触发状态更新,必须实际更新状态对象。
也就是说,必须将状态替换为不等于由相等运算符==
计算的旧值的东西,以触发对其侦听器的通知。
不要使用List.add
,而是使用spread ...
创建一个新列表:
class TxState extends StateNotifier<List<Transaction>> {
TxState([List<Transaction>? _transaction]) : super(_transaction ?? []);
void addTx(Transaction tx) {
state = [...state, tx];
}
}
https://stackoverflow.com/questions/66892009
复制相似问题