Flutter 在列表视图后禁用FloatingAction按钮并显示超出限制的消息

Flutter 在列表视图后禁用FloatingAction按钮并显示超出限制的消息,flutter,mobile,flutter-layout,Flutter,Mobile,Flutter Layout,如何禁用按钮(在本例中为FAB(浮动操作按钮)),并防止用户因超出限制而向列表中添加更多项目并显示消息?我正在使用一个FutureBuilder和一个ListView.builder,在用户向列表中添加3个项目后,我想禁用FAB并阻止用户向列表中添加更多项目,并向用户显示某种通知/消息/浮动按钮消息,说明他超出了每个列表3个项目的限制。代码如下: import 'package:flutter/cupertino.dart'; import 'package:flutter/material.d

如何禁用按钮(在本例中为
FAB(浮动操作按钮)
),并防止用户因超出限制而向列表中添加更多项目并显示消息?我正在使用一个
FutureBuilder
和一个
ListView.builder
,在用户向列表中添加3个项目后,我想禁用FAB并阻止用户向列表中添加更多项目,并向用户显示某种通知/消息/浮动按钮消息,说明他超出了每个列表3个项目的限制。代码如下:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'screens/add_items_screen.dart';
import 'components/items_list.dart';

class ItemScreen extends StatelessWidget {
  static const String id = 'item_screen';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        iconTheme: IconThemeData(
          color: Colors.grey[600],
        ),
      ),
/// I want to disable this button after the limit of 3 items in the list view
      floatingActionButton: FloatingActionButton(
        backgroundColor: Colors.grey,
        child: Icon(Icons.add),
        onPressed: () {
          showModalBottomSheet(
              context: context,
              isScrollControlled: true,
              builder: (context) => SingleChildScrollView(
                      child: Container(
                    padding: EdgeInsets.only(
                        bottom: MediaQuery.of(context).viewInsets.bottom),
                    child: AddItemScreen(),
                  )));
        },
      ),
      body: SafeArea(
        child: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(20.0),
            color: Colors.grey[100],
            child: Container(
              height: 800,
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    'Item List Display',
                    style: TextStyle(
                      fontSize: 22.0,
                      fontWeight: FontWeight.w700,
                    ),
                  ),
                  SizedBox(
                    height: 20.0,
                  ),
                  Expanded(
                    child: Column(
                      children: [
/// Here is where the items are rendered as a list
                        Expanded(child: ItemList()),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
项目列表组件:

import 'package:flutter/material.dart';
import 'common/api/api_caller.dart';
import 'utilities/item_api_helper.dart';
import 'models/item.dart';
import 'stores/item_store.dart';
import 'dart:async';
import 'package:provider/provider.dart';


class ItemList extends StatefulWidget {
  @override
  _ItemList createState() => _ItemList();
}

class _ItemList extends State<ItemList> {
  Future<HTTPResponse<List<ItemData>>> _getItemList() async {
    var _itemData = await APICaller.instance.getItems();
    var provider = Provider.of<ItemDatStore>(context, listen: false);

    provider.setItemList(_itemData.data, notify: false);

    return _itemData;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: FutureBuilder<HTTPResponse<List<ItemData>>>(
          future: _getItemList(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Consumer<ItemDataStore>(
                builder: (context, itemData, child) {
                  return ListView.builder(
                    itemCount: itemData.itemList.length,
                    itemBuilder: (context, index) {
                      ItemData items =
                          itemData.getItemByIndex(index);
                      return Card(
                        child: Container(
                          padding: EdgeInsets.all(10.0),
                          child: Text('items.title'),
                  ),
              );
            } else if (snapshot.hasError) {
              return Text("${snapshot.error}");
            }
            return Container();
          },
        ),
      ),
    );
  }
}

导入“包装:颤振/材料.省道”;
导入“common/api/api_caller.dart”;
导入“实用程序/item_api_helper.dart”;
导入“models/item.dart”;
导入'stores/item_store.dart';
导入“dart:async”;
导入“包:provider/provider.dart”;
类ItemList扩展了StatefulWidget{
@凌驾
_ItemList createState()=>\u ItemList();
}
类_ItemList扩展了状态{
Future\u getItemList()异步{
var_itemData=wait APICaller.instance.getItems();
var provider=provider.of(上下文,侦听:false);
provider.setItemList(_itemData.data,notify:false);
返回_itemData;
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
孩子:未来建设者(
未来:_getItemList(),
生成器:(上下文,快照){
if(snapshot.hasData){
退货消费者(
生成器:(上下文、项数据、子项){
返回ListView.builder(
itemCount:itemData.itemList.length,
itemBuilder:(上下文,索引){
项目数据项=
itemData.getItemByIndex(索引);
回程卡(
子:容器(
填充:所有边缘设置(10.0),
子项:文本('items.title'),
),
);
}else if(snapshot.hasrerror){
返回文本(“${snapshot.error}”);
}
返回容器();
},
),
),
);
}
}

我尝试过使用
if
语句,在这里我可以定义
if(itemData.itemList.length您可以像这样禁用FAB

onPressed: items.length < 3? addItemToList : null;

您可以像这样禁用晶圆厂

onPressed: items.length < 3? addItemToList : null;

您可以使用隐藏的可见性包装浮动操作按钮,使其不再工作:)


您可以使用隐藏的可见性包装浮动操作按钮,使其不再工作:)


谢谢,但如何通知用户按钮因超出限制而禁用?您可以通知显示晶圆厂内外的一些倒计时数字。谢谢,但如何通知用户按钮因超出限制而禁用?您可以通知显示晶圆厂内外的一些倒计时数字。
Visibility(
            visible: items.length > 3,
            child : FAB here,

          ),