【发布时间】:2021-01-01 01:15:55
【问题描述】:
我正在构建一个应用程序来从一个流行的动漫网站流式传输动漫。但是,我想在应用程序启动时运行某个 Provider 方法。加载应用程序后,我想在用户单击“搜索”选项卡之前从 api 获取一些动画。
我想指出这个解决方案对我不起作用:How to call method at App start if I am using provider?
我的代码:
main.dart
import 'package:anime_go/pages/home.dart';
import 'package:anime_go/providers/anime.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
EasyLocalization(
supportedLocales: [Locale('en', 'US')],
path: 'lib/assets/translations',
fallbackLocale: Locale('en', 'US'),
child: AnimeGO(),
),
);
}
class AnimeGO extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => Anime()..addAnimeList(),
child: MaterialApp(
theme: ThemeData(
primaryColor: Colors.blueGrey[800],
),
title: 'title'.tr(),
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
home: HomeScreen(),
),
);
}
}
providers/anime.dart
import 'package:anime_go/services/anime_twist.dart';
import 'package:flutter/cupertino.dart';
class Anime extends ChangeNotifier {
var allAnimeList;
final AnimeTwistApiService api = AnimeTwistApiService();
void addAnimeList() async {
allAnimeList = await api.getAllAnime();
notifyListeners();
}
}
pages/tabs/search.dart
import 'package:anime_go/providers/anime.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class SearchTab extends StatelessWidget {
@override
Widget build(BuildContext context) {
final allAnimeList = context.watch<Anime>().allAnimeList;
return Center(
child: Column(
children: <Widget>[
for (var i = 0; i < allAnimeList.length; i++)
Text(allAnimeList[i].title.toString())
],
),
);
}
}
pages/home.dart
import 'package:anime_go/pages/tabs/home.dart';
import 'package:anime_go/pages/tabs/search.dart';
import 'package:flutter/material.dart';
import 'package:easy_localization/easy_localization.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _selectedIndex = 0;
final List<Widget> _children = <Widget>[
HomeTab(),
SearchTab(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blueGrey[700],
appBar: AppBar(
title: Text('title').tr(),
),
body: _children[_selectedIndex],
bottomNavigationBar: BottomNavigationBar(
backgroundColor: Colors.blueGrey[800],
items: <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('home').tr(),
),
BottomNavigationBarItem(
icon: Icon(Icons.search),
title: Text('search').tr(),
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
title: Text('settings').tr(),
)
],
currentIndex: _selectedIndex,
selectedItemColor: Colors.white,
unselectedItemColor: Colors.grey,
onTap: _onItemTapped),
);
}
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
}
}
【问题讨论】:
-
我认为您正在获取数据,有什么问题?
-
@jitsm555 是的,你是对的,但我想在用户点击搜索选项卡之前获取该数据。一旦用户点击搜索选项卡,它就会从 api 中获取动漫列表。这不是 O 想要的样子。
-
调用最终 allAnimeList = context.watch
().allAnimeList;在提供者初始化后的主应用代码上 -
@jitsm555 我该怎么做?
-
告诉我你是如何在标签下添加的,之后我可以给你提示