【问题标题】:How can I use a future list of object from database to trigger rebuild using flutter provider?如何使用来自数据库的未来对象列表来触发使用颤振提供程序重建?
【发布时间】:2021-12-11 17:26:29
【问题描述】:
class StudentProvider extends ChangeNotifier {
DataBaseHelper data = DataBaseHelper();
List<StudentModel>? student = [];
List<StudentModel>? searchStudentList;
Future<List<StudentModel>> getStudentList() async {
student = await data.getStudent();
return student!;
}

void insert(StudentModel studentModel) async {
print("reached insert in provider class");
await data.insertStudent(studentModel);
notifyListeners();
}
}

上面的代码是我的提供程序类,我想使用从 getStudentList 列表方法获得的列表来构建小部件。问题是它返回一个未来,因为我从数据库中获取数据。

  body: TabBarView(children: [
          Consumer<StudentProvider>(
              builder: (context, StudentProvider student, ch) {
            print("rebuild happened");
            return ListView(
              children: [
                ...student.getStudentList().map((e) {
                  return HomeScreen(student: e);
                }).toList(),
              ],
            );
          }),

这是我尝试构建小部件的地方。我做不到。

【问题讨论】:

    标签: flutter provider


    【解决方案1】:
    in getStudentList() you have used  Future<List<StudentModel>> so that future can not access in listview.
    
    > So please use streambuilder or remove the future from the list
    
    
    
     class StreamBuilderUsage extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    child: Center(
                      child: Consumer<StudentProvider>(
                          builder: (context, StudentProvider student, ch) {
                          return StreamBuilder(
                            stream: student.getStudentList().asStream(),
                            builder: (context, snapshot){
                              print(snapshot.connectionState);
                              if(snapshot.hasData){
                                var data = snapshot.data as List<String>;
                                return ListView.builder(
                                  itemCount: data.length,
                                  itemBuilder: (context, index){
                                    return Text(data[index]);
                                  },
                                );
                              }else{
                                return CircularProgressIndicator();
                              }
                            },
                          );
                        }
                      ),
                    ),
                  ),
                ],
              ),
            );
          }
        }
    

    【讨论】:

    • 如何从该列表中删除该未来?这就是我正在寻找的
    【解决方案2】:

    我接受的答案也将起作用,我们可以使用 Future builder 来做同样的事情。 这是代码:-

     body: TabBarView(
              children: [
                Consumer<StudentProvider>(
                  builder: (context, StudentProvider student, ch) {
                    print("rebuild happened");
                    return FutureBuilder(
                      future: student.getStudentList(),
                      builder: (context, snapshot) {
                        if (snapshot.hasData) {
                          List<StudentModel> data =
                              snapshot.data as List<StudentModel>;
                          return ListView.builder(
                              itemCount: data.length,
                              itemBuilder: (context, index) {
                                return HomeScreen(student: data[index]);
                              });
                        } else
                          return Container(child: Text("No data"));
                      },
                    );
                  },
                ),
                Container(),//neglect this container 
              ],
            ),
    

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多