flutter中模型之间的依赖性

问题描述 投票:0回答:1

请帮助我。有一个数据库,里面有几个表。

(1) 诗的作者姓名.(2) 诗的名字。

一个表与另一个表之间用ID连接(在诗名表中有一列作者ID)。

需要通过点击作者诗打开这个作者的诗。我不知道如何建立这种连接。

Authors.dart (作者的模型)

Authors authorsFromJson(String str) {
  final jsonData = json.decode(str);
  return Authors.fromMap(jsonData);
}

String authorsToJson(Authors data) {
  final dyn = data.toMap();
  return json.encode(dyn);
}

class Authors {
  int id;
  String name;
  int count;

  Authors({
    this.id,
    this.name,
    this.count,
  });

  factory Authors.fromMap(Map<String, dynamic> json) => new Authors(
        id: json["c_id"],
        name: json["c_title"],
        count: json["c_i_count"],
      );

  Map<String, dynamic> toMap() => {
        "c_id": id,
        "c_title": name,
        "c_i_count": count,
      };
}

PoemsTitle.dart (诗题的模型)

PoemsTitle poemsTitleFromJson(String str) {
  final jsonData = json.decode(str);
  return PoemsTitle.fromMap(jsonData);
}

String poemsTitleToJson(PoemsTitle data) {
  final dyn = data.toMap();
  return json.encode(dyn);
}

class PoemsTitle {
  int id;
  String title;
  int authorsId;

  PoemsTitle({
    this.id,
    this.title,
    this.authorsId,
  });

  factory PoemsTitle.fromMap(Map<String, dynamic> json) => new PoemsTitle(
    id: json["ii_i_id"],
    title: json["ii_i_title"],
    authorsId: json["ii_col_int_2"],
  );

  Map<String, dynamic> toMap() => {
    "ii_i_id": id,
    "ii_i_title": title,
    "ii_col_int_2": authorsId,
  };
}

专栏 c_title 来自 种类 表必须与列 ii_col_int_2 来自 项目信息 表。

来自DBProvider的方法。

...Future<List<Authors>> getAllAuthors() async {
    final db = await database;
    var res = await db.query('category');
    List<Authors> list = res.map((c) => Authors.fromMap(c)).toList();
    return list;
}

Future<List<PoemsTitle>> getAllPoemsTitle() async {
    final db = await database;
    var res = await db.query('items_info');
    List<PoemsTitle> list = res.map((c) => PoemsTitle.fromMap(c)).toList();
    return list;
}

以及来自FutureBuilder和ListView. builder的页面:

这是一个Widget,点击相应的作者后,就会显示诗词。

class FavoriteTab extends StatelessWidget {
  int authorId;
  int count;

  FavoriteTab({this.authorId, this.count});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
          body: Padding(
        padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),
        child: Container(
            padding: EdgeInsets.all(5),
            decoration: BoxDecoration(
                color: Theme.of(context).accentColor,
                borderRadius: BorderRadius.all(Radius.circular(30))
            ),
            child: FutureBuilder<List<PoemsTitle>>(
              future: DBProvider.db.getAllPoemsTitle(),
              builder: (context, snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.waiting:
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  case ConnectionState.done:
                    {
                      if (snapshot.hasError) {
                        return Center(
                          child: Text(snapshot.error.toString()),
                        );
                      } else if (snapshot.hasData) {
                        return Scrollbar(
                            child: ListView.builder(
                              physics: BouncingScrollPhysics(),
                              itemCount: this.count,
                              itemBuilder: (context, index) {
                                PoemsTitle item = snapshot.data[index];
                                return ListTile(
                                  title: Text(item.title),
                                  leading: Icon(Icons.receipt),
                                  trailing: Icon(Icons.favorite, color: Colors.red, size: 34),
                                  onTap: () {

                                  },
                                );
                              },
                            )
                        );
                      }
                      return Center(
                          child: Text('No Data')
                      );
                    }
                  default:
                    return Container();
                }
              },
            )
        ),
      ),
    );
  }
}

这是一个有作者的小部件

class MainTab extends StatefulWidget {
  @override
  _MainTabState createState() => _MainTabState();
}

class _MainTabState extends State<MainTab> {

  @override
  Widget build(BuildContext context) {
      return Padding(
        padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),
        child: Container(
            padding: EdgeInsets.all(5),
            decoration: BoxDecoration(
                color: Theme.of(context).accentColor,
                borderRadius: BorderRadius.all(Radius.circular(30))
            ),
            child: FutureBuilder<List<Authors>>(
              future: DBProvider.db.getAllAuthors(),
              builder: (context, snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.waiting:
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  case ConnectionState.done:
                    {
                      if (snapshot.hasError) {
                        return Center(
                          child: Text(snapshot.error.toString()),
                        );
                      } else if (snapshot.hasData) {
                        return Scrollbar(
                            child: ListView.builder(
                              physics: BouncingScrollPhysics(),
                              itemCount: snapshot.data.length,
                              itemBuilder: (context, index) {
                                Authors item = snapshot.data[index];
                                return ListTile(
                                  title: Text(item.name),
                                  leading: Icon(Icons.folder),
                                  trailing: Text(item.count.toString()),
                                  onTap: () {
                                    Navigator.push(
                                      context,
                                      MaterialPageRoute(
                                        builder: (context) => FavoriteTab(authorId: item.id, count: item.count)
                                      )
                                    );

                                  },
                                );
                              },
                            )
                        );
                      }
                      return Center(
                        child: Text('No Data')
                      );
                    }
                  default:
                    return Container();
                }
              },
            )
        ),
      );
    }
}
sqlite flutter dart
1个回答
0
投票

我认为问题出在这一行,在 FavoriteTab 小工具。

future: DBProvider.db.getAllPoemsTitle(),

在这里你可以随时查询所有的诗。正确的做法是创建一个像 getPoemOfAuthor(int authorID)DBProvider既然你通过了 authorId 当你打开你的 FavoriteTab,在 FutureBuilder 你一定要打电话。

future: DBProvider.db.getPoemOfAuthor(authorId),

希望能帮到你!

© www.soinside.com 2019 - 2024. All rights reserved.