Зависимости между моделями в флаттере - PullRequest
0 голосов
/ 24 апреля 2020

Помогите мне, пожалуйста. Есть база данных, которая содержит несколько таблиц:

1) Имена авторов стихов. 2) Имена стихов.

Одна таблица связана с другой с помощью идентификатора (в таблице с именами стихов есть столбец с идентификатором автора).

Это Необходимо, чтобы при нажатии на автора стихи этого автора открывались. Я не могу понять, как сделать это соединение.

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)

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 из таблицы category должен быть связан со столбцом ii_col_int_2 из items_info таблица.

Методы от 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:

Это виджет, в котором отображаются стихи после нажатия на соответствующего автора:

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();
                }
              },
            )
        ),
      );
    }
}

1 Ответ

0 голосов
/ 24 апреля 2020

Я думаю, что проблема в этой строке, в виджете FavoriteTab:

future: DBProvider.db.getAllPoemsTitle(),

Здесь вы ВСЕГДА запрашиваете все стихи. Правильнее всего создать такой метод, как getPoemOfAuthor(int authorID) в DBProvider, и, поскольку вы передаете authorId при открытии FavoriteTab, в FutureBuilder вы должны вызвать:

future: DBProvider.db.getPoemOfAuthor(authorId),

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...