我是Flutter的初学者,刚刚创建了我的第一个基本应用程序。 它使用listview作为带有FloatinActionButton的首页,该FloatinActionButton导航到另一个页面。该页面上有一个表单,该表单将一个对象返回到第一页。
观看和阅读许多视频和教程后,我不明白,为什么我的首页的列表视图没有更新。一旦我最小化该应用程序或导航到另一个页面并返回,列表视图将被更新,但不会在我提交表单后立即更新。
我正在使用BloC模式(只是修改了教程中的复制粘贴)和StreamBuilder。
这是我的main.dart
import 'package:flutter/material.dart';
import 'package:vartest/sqlitedatabase/DatabaseBloc.dart';
import 'carts.dart';
class AddCartFormPage extends StatefulWidget {
final List carts;
AddCartFormPage({Key key, @required this.carts}) : super(key: key);
@override
_AddCartFormPageState createState() => _AddCartFormPageState();
}
class _AddCartFormPageState extends State<AddCartFormPage> {
TextEditingController shopnameController = TextEditingController();
TextEditingController createdDateController = TextEditingController();
void submitItem(BuildContext context) {
if (shopnameController.text.isEmpty) {
print('Item need name');
} else {
var newCart = new Carts();
newCart.shopName = shopnameController.text;
newCart.createdDate = DateTime.now().millisecondsSinceEpoch;
Navigator.of(context).pop(newCart);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Hinzufügen'),
),
body: Container(
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 8.0,
horizontal: 32.0,
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: TextField(
controller: shopnameController,
decoration: InputDecoration(
labelText: 'Name',
)),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Builder(
builder: (context) {
// The basic Material Design action button.
return RaisedButton(
// If onPressed is null, the button is disabled
// this is my goto temporary callback.
onPressed: () => submitItem(context),
color: Colors.blue,
child: Text('Übernehmen', style: TextStyle(color: Colors.white),),
);
},
),
),
],
),
),
),
);
}
}
我的表单(new_cart_form_data.dart
import 'dart:async';
import 'package:vartest/carts.dart';
import 'package:vartest/cart_items.dart';
import 'Database.dart';
class CartsBloc {
final _cartsController = StreamController<List<Carts>>.broadcast();
get carts => _cartsController.stream;
dispose() {
_cartsController.close();
}
getCarts() async {
_cartsController.sink.add(await DBProvider.db.getAllCarts());
}
CartsBloc() {
getCarts();
}
delete(int id) {
DBProvider.db.deleteCarts(id);
getCarts();
}
add(Carts carts) {
DBProvider.db.newCarts(carts);
getCarts();
}
}
我的BloC
{{1}}
答案 0 :(得分:0)
必须使用setState()
方法通知对象的内部状态已更改。该框架将安排State对象的构建。返回上一页时,添加将在其中更新数据的操作。
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => ShoppingList(cart: cart),
)).then((newCart) {
// back to this page
setState(() {
// update the cart/data here
})
});