【问题标题】:How to run a Provider method at app start?如何在应用程序启动时运行 Provider 方法?
【发布时间】: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 我该怎么做?
  • 告诉我你是如何在标签下添加的,之后我可以给你提示

标签: flutter dart


【解决方案1】:

在 HomeScreen 内致电 Provider

var allAnimeList

  final List<Widget> _children = <Widget>[
    HomeTab(),
    SearchTab(allAnimeList),
  ];

 @override
  Widget build(BuildContext context) {
   allAnimeList = context.watch<Anime>().allAnimeList;
    return Scaffold(
      backgroundColor: Colors.blueGrey[700],
      appBar: AppBar(
        title: Text('title').tr(),
      ),
      // Rest code

【讨论】:

  • 不,这不起作用。我想在 InitState 中运行提供程序方法。这可能吗?
  • @szakes1:你解决了这个问题吗?如果我的回答有帮助,那就采纳吧。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多