dart 下拉按钮'项目== null|| items.isEmpty ||值==空||项目,where((下拉菜单< T>项目){返回项目,值==值;

368yc8dk  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(123)

我已经搜索以下错误2天了,但我无法解决它。error code
error snap from debugging
我有一个DropDownButton,我从一个为我提供ItemWidget列表的streambuilder中获取了dropdownbuttonitem的数据。问题是当我从其他屏幕添加、删除或编辑列表数据时,我在DropDownClass中遇到了上述错误。我的列表是动态的,我不知道如何修复,请帮助我。

下拉式类别

ItemModel? dropdownvalue;
@override
Widget build(BuildContext context) {
return StreamBuilder<List<ItemModel>>(
    stream: streamItems,
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        // return a progress indicator, for example:
        return const Center(
          child: CircularProgressIndicator(),
        );
      }
      if (!snapshot.hasData) {
        return const Center(child: Text('Empty'));
      }
      final items = snapshot.data!;
      return DropdownButton<ItemModel>(
        itemHeight: null,
        isExpanded: true,
        // Initial Value
        value: dropdownvalue,

        // Down Arrow Icon
        hint: Text(
          '   Select Item',
          style: TextStyle(color: Theme.of(context).colorScheme.secondary),
        ),

        icon: const Icon(Icons.keyboard_arrow_down),
        items: items.map((ItemModel item) {
          // if (dropdownvalue != null) {}

          return DropdownMenuItem(
            value: item,
            child: Padding(
              padding: const EdgeInsets.all(10.0),
              child: Row(
                children: [
                  Text(
                    item.itemName,
                    style: TextStyle(
                        fontSize: 18,
                        fontWeight: FontWeight.bold,
                        color: Theme.of(context).colorScheme.secondary),
                  ),
                  const SizedBox(
                    width: 08,
                  ),
                  Text(
                    '(Rs. ${item.price.toStringAsFixed(0)})',
                    style: TextStyle(),
                  ),
                ],
              ),
            ),
          );
        }).toList(),
        onChanged: (ItemModel? newValue) {
          setState(() {
            dropdownvalue = newValue!;
          });
          double price = newValue!.price;
          widget.handler(newValue);
        },
      );
    });

}

这是我添加和编辑数据的类

import 'package:flutter/material.dart';
import 'package:saltanat_marriage_hall/helpers/object_box.dart';
import 'package:saltanat_marriage_hall/main.dart';
import 'package:saltanat_marriage_hall/models/item_model.dart' as im;
import 'package:saltanat_marriage_hall/widgets/item.dart' as iw;

import '../widgets/Item.dart';

class CustomizationScreen extends StatefulWidget {
  final ObjectBox objectBox;
  static const routeName = '/customizationPage';
  const CustomizationScreen({required this.objectBox, Key? key})
      : super(key: key);

  @override
  State<CustomizationScreen> createState() => _CustomizationScreenState();
}

class _CustomizationScreenState extends State<CustomizationScreen> {
  final itemNameController = TextEditingController();
  final itemPriceController = TextEditingController();

  late Stream<List<im.ItemModel>> streamItems;

  @override
  void initState() {
    super.initState();

    streamItems = objectBox.getItems();
  }

  void _addItem(im.ItemModel item) {
    objectBox.insertItem(item);
  }

  void _removeItem(int id) {
    objectBox.deleteUser(id);
  }

  void _editItem(int id, String name, double price) {
    final item = im.ItemModel(id: id, itemName: name, price: price);
    objectBox.insertItem(item);
  }

  final ScrollController _controller = ScrollController();

  void _scrollDown() {
    if (_controller.hasClients) {
      _controller.animateTo(
        _controller.position.maxScrollExtent + 200,
        duration: const Duration(seconds: 1),
        curve: Curves.fastOutSlowIn,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: createAppBar(context),
      body: StreamBuilder<List<im.ItemModel>>(
        stream: streamItems,
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return const Center(
              child: CircularProgressIndicator(),
            );
          } else {
            final items = snapshot.data!;

            return ListView.builder(
              controller: _controller,
              itemCount: items.length,
              itemBuilder: (context, index) {
                final item = items[index];
                return iw.ItemWidget(
                    removeItem: _removeItem, editItem: _editItem, item: item);
              },
            );
          }
        },
      ),
    );
  }

  AppBar createAppBar(BuildContext context) {
    return AppBar(
      iconTheme: const IconThemeData(color: Colors.black),
      title: Text(
        'Customize Items',
        style: Theme.of(context).appBarTheme.titleTextStyle,
      ),
      actions: [
        IconButton(
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (ctx) => AlertDialog(
                        title: Center(
                          child: Text(
                            'Add Item',
                            style: TextStyle(
                                color: Theme.of(context).colorScheme.secondary),
                          ),
                        ),
                        content: IntrinsicHeight(
                          child: Column(
                            children: [
                              Expanded(
                                child: _createTextField(
                                    label: 'Item\'s Name',
                                    textInputType: TextInputType.text,
                                    controller: itemNameController),
                              ),
                              SizedBox(
                                height: 08,
                              ),
                              Expanded(
                                child: _createTextField(
                                    label: 'Item\'s Price',
                                    textInputType: TextInputType.number,
                                    controller: itemPriceController),
                              ),
                            ],
                          ),
                        ),
                        actions: <Widget>[
                          ElevatedButton(
                            style: ElevatedButton.styleFrom(
                                primary: Theme.of(context).primaryColor),
                            onPressed: () {
                              addItem();
                              Navigator.of(ctx).pop();
                            },
                            child: const Text("Done"),
                          ),
                          TextButton(
                            onPressed: () {
                              Navigator.of(context).pop();
                            },
                            child: Text('Cancel'),
                            style: TextButton.styleFrom(
                                primary: Theme.of(context).primaryColor),
                          ),
                        ],
                      ));
            },
            icon: const Icon(Icons.add))
      ],
    );
  }

  TextField _createTextField(
      {required String label,
      required TextInputType textInputType,
      required TextEditingController controller}) {
    return TextField(
      controller: controller,
      keyboardType: textInputType,
      decoration: InputDecoration(
        labelText: label,
        labelStyle: TextStyle(color: Theme.of(context).primaryColor),
        border: const OutlineInputBorder(),
        focusedBorder: OutlineInputBorder(
          borderSide: BorderSide(
            color: Theme.of(context).primaryColor,
          ),
        ),
      ),
    );
  }

  void addItem() {
    if (itemNameController.text.isEmpty || itemPriceController.text.isEmpty) {
      return;
    }
    _addItem(im.ItemModel(
        itemName: itemNameController.text.trim(),
        price: double.parse(itemPriceController.text)));
    _scrollDown();
    itemNameController.clear();
    itemPriceController.clear();
  }
}

我正在将数据存储到OBjectbox中,下面是帮助器类

import '../models/item_model.dart';
import '../objectbox.g.dart';

class ObjectBox {
  late final Store _store;
  late final Box<ItemModel> _itemModelBox;

  ObjectBox._init(this._store) {
    _itemModelBox = Box<ItemModel>(_store);
  }

  static Future<ObjectBox> init() async {
    final store = await openStore();
    return ObjectBox._init(store);
  }

  Stream<List<ItemModel>> getItems() =>
      _itemModelBox.query().watch(triggerImmediately: true).map(
            (query) => query.find(),
          );

  ItemModel? getItem(int id) => _itemModelBox.get(id);
  int insertItem(ItemModel itemModel) => _itemModelBox.put(itemModel);
  bool deleteUser(int id) => _itemModelBox.remove(id);
}
3qpi33ja

3qpi33ja1#

DropdownButton的“值”应设置为“null”或或值列表中的值。

相关问题