Flutter流在另一页上添加数据

时间:2019-02-25 19:14:36

标签: dart stream flutter stream-builder

我是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}}

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