Flutter 颤振多级下拉菜单在第二次选择第一个下拉菜单时不起作用

Flutter 颤振多级下拉菜单在第二次选择第一个下拉菜单时不起作用,flutter,Flutter,我正在尝试实现一个多层相关下拉列表。这两个下拉列表的数据都是从API请求中动态检索的。这是第一次很好用。但是,当我第二次尝试更改第一个下拉列表时,它会显示以下错误 我的代码如下: import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:radius_admin/services/api.dart'; import 'pa

我正在尝试实现一个多层相关下拉列表。这两个下拉列表的数据都是从API请求中动态检索的。这是第一次很好用。但是,当我第二次尝试更改第一个下拉列表时,它会显示以下错误

我的代码如下:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:radius_admin/services/api.dart';
import 'package:radius_admin/screen/drawer_screen.dart';
import 'package:radius_admin/model/menu_item.dart';
import 'package:radius_admin/model/manager.dart';
import 'package:radius_admin/model/pop.dart';
import 'package:radius_admin/model/customer_due_details.dart';

class BillView extends StatefulWidget {
  static String route = 'bill_view';
  @override
  _BillViewState createState() => _BillViewState();
}

class _BillViewState extends State<BillView> {
  List<MenuItem> _items;

  String appUserName = ' ';
  String appUserEmail = ' ';
  String appUserPhoto = ' ';

  Manager selectedManagerItem;
  Pop selectedPopItem;

  List<Manager> _managerList = [];
  List<Pop> _popList = [];

  Manager m = Manager(id: -1, name: '--Choose--');
  Pop p = Pop(id: -1, name: '--Choose--');

  List<CustomerDueDetails> _dueList = [];

  @override
  void initState() {
    sharedPref();
    getMenu();
    getManagerList();
    super.initState();
  }

  @override
  void dispose() {
    getMenu();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bill View'),
      ),
      drawer: SideMenu(
        context: context,
        appUserEmail: appUserEmail,
        appUserName: appUserName,
        appUserPhoto: appUserPhoto,
        items: _items,
      ),
      body: SingleChildScrollView(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            androidDropdownManager(),
            androidDropdownPop(),
            /*FutureBuilder(
              builder: (context, projectSnap) {
                if (projectSnap.connectionState == ConnectionState.none &&
                    projectSnap.hasData == null) {
                  //print('project snapshot data is: ${projectSnap.data}');
                  return Container();
                }
                return ListView.builder(
                  itemCount: projectSnap.data.length,
                  itemBuilder: (context, index) {
                    CustomerDueDetails data = projectSnap.data[index];
                    print(data.customerName);
                    return Column(
                      children: <Widget>[
                        //Text(data.customerName),
                      ],
                    );
                  },
                );
              },
              future: customerDueSearch(),
            ),*/
            SizedBox(
              height: 10.0,
            ),
            Container(
              padding: EdgeInsets.only(top: 30.0),
              child: Text(
                'Developed By: Md Emran Hossain & Anwar Hossain',
                style: TextStyle(
                  fontSize: 15.0,
                  color: Colors.grey,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  void sharedPref() async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      setState(() {
        appUserEmail = prefs.getString('user');
        appUserName = prefs.getString('userName');
        appUserPhoto = prefs.getString('userPhoto');
      });
    } catch (e) {
      print(e);
    }
  }

  getMenu() async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String token = prefs.getString('token');
      var data =
          await Api().callBasicAPI(apiUrl: 'api/get-menu-list', token: token);
      List collection = data;
      setState(() {
        _items = collection.map((json) => MenuItem.fromJson(json)).toList();
      });
    } catch (e) {
      print(e);
    }
  }

  getManagerList() async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String token = prefs.getString('token');
      var data = await Api()
          .callBasicAPI(apiUrl: 'api/get-manager-list', token: token);

      List collection = data;
      setState(() {
        _managerList =
            collection.map((json) => Manager.fromJson(json)).toList();
      });
    } catch (e) {
      print(e);
    }
  }

  DropdownButton<Manager> androidDropdownManager() {
    try {
      List<DropdownMenuItem<Manager>> dropdownItems = [];

      for (Manager item in _managerList ?? m) {
        var newItem = DropdownMenuItem(
          child: Text(item.name),
          value: item,
        );
        dropdownItems.add(newItem);
      }

      return DropdownButton<Manager>(
        value: selectedManagerItem,
        isExpanded: true,
        items: dropdownItems,
        onChanged: (value) {
          setState(() {
            selectedManagerItem = value;
          });
          getPopList();
        },
      );
    } catch (e) {
      print(e);
    }
  }

  getPopList() async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String token = prefs.getString('token');
      var data = await Api().getPopList(
          apiUrl: 'api/get-pop-list',
          token: token,
          managerId: selectedManagerItem.id.toString());

      List collection = data;
      setState(() {
        _popList = collection.map((json) => Pop.fromJson(json)).toList();
      });
    } catch (e) {
      print(e);
    }
  }

  DropdownButton<Pop> androidDropdownPop() {
    try {
      List<DropdownMenuItem<Pop>> dropdownItems = [];
      for (Pop item in _popList) {
        var newItem = DropdownMenuItem(
          child: Text(item.name),
          value: item,
        );
        dropdownItems.add(newItem);
      }

      return DropdownButton<Pop>(
        value: selectedPopItem,
        isExpanded: true,
        items: dropdownItems,
        onChanged: (value) {
          setState(() {
            selectedPopItem = value;
          });
//          customerDueSearch();
        },
      );
    } catch (e) {
      print(e);
    }
  }

  Future customerDueSearch() async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String token = prefs.getString('token');
      var data = await Api().getDueBillList(
          apiUrl: 'api/get-due-bill-list',
          token: token,
          popId: selectedPopItem.id.toString());
      List collection = data;

      return _dueList =
          collection.map((json) => CustomerDueDetails.fromJson(json)).toList();
    } catch (e) {
      print(e);
    }
  }
}
导入“包装:颤振/材料.省道”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“包:radius_admin/services/api.dart”;
导入“package:radius_admin/screen/drawer_screen.dart”;
导入“package:radius_admin/model/menu_item.dart”;
导入“package:radius_admin/model/manager.dart”;
导入“包:radius_admin/model/pop.dart”;
导入“包:radius_admin/model/customer_due_details.dart”;
类BillView扩展了StatefulWidget{
静态字符串路由='bill_view';
@凌驾
_BillViewState createState();
}
类_BillViewState扩展状态{
列出项目;
字符串appUserName='';
字符串appUserEmail='';
字符串appUserPhoto='';
经理选择管理准则;
Pop选择PopItem;
列表_managerList=[];
列表_popList=[];
经理m=经理(id:-1,名称:'--选择--');
Pop p=Pop(id:-1,name:'--Choose--');
列表_dueList=[];
@凌驾
void initState(){
sharedPref();
getMenu();
getManagerList();
super.initState();
}
@凌驾
无效处置(){
getMenu();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“票据视图”),
),
抽屉:侧菜单(
上下文:上下文,
appUserEmail:appUserEmail,
appUserName:appUserName,
appUserPhoto:appUserPhoto,
项目:_项目,
),
正文:SingleChildScrollView(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
androidDropdownManager(),
androidDropdownPop(),
/*未来建设者(
生成器:(上下文,projectSnap){
如果(projectSnap.connectionState==connectionState.none&&
projectSnap.hasData==null){
//打印('项目快照数据为:${projectSnap.data}');
返回容器();
}
返回ListView.builder(
itemCount:projectSnap.data.length,
itemBuilder:(上下文,索引){
CustomerDueDetails数据=projectSnap.data[索引];
打印(data.customerName);
返回列(
儿童:[
//文本(data.customerName),
],
);
},
);
},
未来:customerDueSearch(),
),*/
大小盒子(
身高:10.0,
),
容器(
填充:仅限边缘设置(顶部:30.0),
子:文本(
“开发人:Md Emran Hossain&Anwar Hossain”,
样式:TextStyle(
字体大小:15.0,
颜色:颜色。灰色,
),
),
),
],
),
),
);
}
void sharedPref()异步{
试一试{
SharedReferences prefs=等待SharedReferences.getInstance();
设置状态(){
appUserEmail=prefs.getString('user');
appUserName=prefs.getString('userName');
appUserPhoto=prefs.getString('userPhoto');
});
}捕获(e){
印刷品(e);
}
}
getMenu()异步{
试一试{
SharedReferences prefs=等待SharedReferences.getInstance();
String token=prefs.getString('token');
var数据=
wait Api().callBasicAPI(apirl:'Api/get menu list',token:token);
列表收集=数据;
设置状态(){
_items=collection.map((json)=>MenuItem.fromJson(json)).toList();
});
}捕获(e){
印刷品(e);
}
}
getManagerList()异步{
试一试{
SharedReferences prefs=等待SharedReferences.getInstance();
String token=prefs.getString('token');
var data=await Api()
.callBasicAPI(apirl:'api/get manager list',标记:标记);
列表收集=数据;
设置状态(){
_经理名单=
collection.map((json)=>Manager.fromJson(json)).toList();
});
}捕获(e){
印刷品(e);
}
}
DropdownButton androidDropdownManager(){
试一试{
列表下拉项=[];
用于(经理列表中的经理项目){
var newItem=DropdownMenuItem(
子项:文本(项名称),
价值:项目,,
);
添加(newItem);
}
返回下拉按钮(
值:selectedManagerItem,
是的,
项目:下拉项目,
一旦更改:(值){
设置状态(){
selectedManagerItem=值;
});
getPopList();
},
);
}捕获(e){
印刷品(e);
}
}
getPopList()异步{
试一试{
SharedReferences prefs=等待SharedReferences.getInstance();
String token=prefs.getString('token');
var data=await Api().getPopList(
apiUrl:“api/获取流行列表”,
令牌:令牌,
managerId:selectedManagerItem.id.toString());
列表收集=数据;
设置状态(){
_popList=collection.map((json)=>Pop.fromJson(json)).toList();
});
}捕获(e){
印刷品(e);
}
}
DropdownButton androidDropdownPop(){
试一试{
列表下拉项=[];
用于(Pop列表中的Pop项目){
var newItem=DropdownMenuItem(
子项:文本(项名称),
价值:项目,,
);
添加(newItem);
}
返回下拉按钮(
值:selectedPopItem,
是的,
项目:dr
Syncing files to device Android SDK built for x86...
I/flutter (25800): 'package:flutter/src/material/dropdown.dart': Failed assertion: line 620 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.
The following assertion was thrown building BillView(dirty, state: _BillViewState#aff4f):
Column's children must not contain any null values, but a null value was found at index 0

User-created ancestor of the error-causing widget was: 
  MaterialApp file:///D:/Android_App/radius_admin/lib/main.dart:15:5
When the exception was thrown, this was the stack: 
#0      new MultiChildRenderObjectWidget.<anonymous closure> (package:flutter/src/widgets/framework.dart:1691:11)
#1      new MultiChildRenderObjectWidget (package:flutter/src/widgets/framework.dart:1697:8)
#2      new Flex (package:flutter/src/widgets/basic.dart:3734:8)
#3      new Column (package:flutter/src/widgets/basic.dart:4270:8)
#4      _BillViewState.build (package:radius_admin/screen/bill_view.dart:62:16)
...
Reloaded 2 of 680 libraries in 472ms.
I/flutter (25800): setState() called after dispose(): _BillViewState#aff4f(lifecycle state: defunct, not mounted)
    I/flutter (25800): This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback.
    I/flutter (25800): The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
    I/flutter (25800): This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().
    I/flutter (25800): 'package:flutter/src/material/dropdown.dart': Failed assertion: line 620 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.