#android #flutter #dart
Вопрос:
Я создаю приложение для просмотра фильмов. Я сделал свое приложение таким:
- Главный.dart, который запускает проект и содержит весь процесс Tmdb (База данных фильмов)
- Root_page.dart, которые содержат все «неподвижные» элементы (панель приложений, нижняя панель навигации, просмотр страницы…)
- Посылка.dart, которые содержат все переменные и ресурсы моего проекта ()
- Файлы страниц (домашняя страница.dart, избранная страница.dart…)(Обратите внимание, что мой проект еще не завершен).
(Извините, если вы не понимаете какой-то текст, это потому, что мое приложение на французском языке)
Так вот в чем моя проблема :
Я сделал список карт, которые показывают последние фильмы в кинотеатре (с помощью Tmdb (
class _MyAppState extends State<MyApp> {
@override
void initState() {
loadmovies();
super.initState();
}
loadmovies() async {
TMDB tmdbWithCustomLogs = TMDB(ApiKeys(apikey, readaccesstoken),
logConfig: ConfigLogger(showLogs: true, showErrorLogs: true));
Map latestresult = await tmdbWithCustomLogs.v3.movies.getNowPlaying();
setState(() {
latestmovies = latestresult['results'];
});
}
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: RootPage(),
);
}
}
) ). Я хотел добавить «любимую кнопку» (проверьте мой макет figma).
Проблема в том, что я использовал ListView.builder (), поэтому, когда я добавил кнопку и ontap (), все кнопки одновременно изменили цвет.
Это моя домашняя страница.dart:
class _HomePageState extends State<HomePage> {
int _selectedIndex = 0;
_onSelected(int index) {
setState(() => _selectedIndex = index);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Container(
//subtitle
margin: const EdgeInsets.only(top: 70, left: 16),
child: Text(
dAppTitle,
style: GoogleFonts.kanit(
fontWeight: FontWeight.w400,
color: dLightGray,
fontSize: 20),
)),
Container(
//title
margin: const EdgeInsets.only(left: 16),
child: Text(
dHomePageMoviesSubTitle,
style: GoogleFonts.kanit(
fontWeight: FontWeight.w400,
color: Colors.black,
fontSize: 24),
)),
Container(
//cards
margin: const EdgeInsets.only(top: 5),
height: 250,
child: ListView.builder(
itemBuilder: (context, index) => Container(
height: 100,
width: 150,
margin: const EdgeInsets.all(8),
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(25)),
boxShadow: [
BoxShadow(
color: Colors.black38,
spreadRadius: 0,
blurRadius: 10)
],
),
child: ClipRRect(
borderRadius:
const BorderRadius.all(Radius.circular(25)),
child: Stack(children: [
Flexible(
child: Image(
image: NetworkImage(
'https://image.tmdb.org/t/p/w500'
latestmovies[index]
['poster_path']),
fit: BoxFit.cover)),
IconButton(
onPressed: () => setState(
() => pressAttention = !pressAttention),
icon: const Icon(Icons.star_rounded),
color: _selectedIndex == index
? Colors.red
: Colors.white,
iconSize: 35,
)
]))),
scrollDirection: Axis.horizontal,
itemCount: latestmovies.length)),
Container(
//title
margin: const EdgeInsets.only(left: 16),
child: Text(
dHomePageCinemaSubtitle,
style: GoogleFonts.kanit(
fontWeight: FontWeight.w400,
color: Colors.black,
fontSize: 20),
)),
ListView.builder(
padding: const EdgeInsets.only(top: 5),
itemCount: 5,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) => const ListTile(
title: Text(dCinemaTileName),
subtitle: Text(dCinemaTileAdress),
leading: SizedBox(
height: 50,
width: 50,
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(10)),
child: Image(
image: AssetImage('images/cinema.jpg'),
fit: BoxFit.cover,
),
))),
)
]),
),
);
}
}