0

在大量的视频和课程之后,我正在尝试制作我的第一个应用程序。在此之前我没有编程经验。Dart/Flutter 是我的第一语言,我无法完成应用程序的最后一步。

我的第一次尝试是能够从 ListView.builder 添加和删除股票,但我无法从 api 获取数据以正常工作。

我想出了如何以我需要的方式使用 api,但我无法让它与应用程序的构建方式一起工作。所以我完全重新设计了应用程序以使用 api 数据,但现在我无法弄清楚如何使用 TextField 添加股票并使用 Dismissible 删除它们。

我讨厌寻求帮助,因为我正在尝试自学,但是自从构建 ui 以来,我已经被困了 2 周。我看过很多视频并在 Stack 上提出了问题,但都没有运气。

如果有人能告诉我如何实现状态管理,将不胜感激!

https://github.com/romajc84/my_stock_app.git

4

1 回答 1

0

我检查了代码库,首先对初学者来说做得很好!我写了一些笔记(我没有时间写很多东西,但你必须更多地关注架构)。

解除功能是通过简单的 Dismissible 小部件完成的。

我讨厌寻求帮助,因为我正在尝试自学,但是自从构建 ui 以来,我已经被困了 2 周。

不要讨厌问^_^。可以问,但你的问题应该是有针对性的和具体的。您不应该期望人们在您的存储库中搜索并修复您的错误。你必须展示你有疑问的代码片段,你尝试了什么,你期望什么以及你得到了什么。并尝试在每个帖子中保留一个特定问题。

这样你就会得到你想要的帮助。

我只使用 ChangeNotifier 实现了添加机制,如下所示:

import 'dart:collection';

import 'package:flutter/material.dart';
import 'package:http/http.dart';

import 'http_etf.dart';
import 'http_stock.dart';

class ProvModel extends ChangeNotifier {
  static const _defaultSymbols = ['t', 'aapl', 'tsla', 'amd', 'googl', 'spy'];

  final List<Stock> _symbols = [];
  final List<Etf> _etf = [];
  bool _adding = false;

  void fetchData() async {
    _fetchEtf().catchError(print);
    _fetchStocks().catchError(print);
  }

  Future<void> _fetchStocks() async {
    final stocks = await fetchStocks(_defaultSymbols, Client());
    _symbols.addAll(stocks);
    notifyListeners();
  }

  Future<void> _fetchEtf() async {
    final etf = await fetchEtf(Client());
    _etf.addAll(etf);
    notifyListeners();
  }

  UnmodifiableListView<Stock> get symbols => UnmodifiableListView(_symbols);
  UnmodifiableListView<Etf> get etf => UnmodifiableListView(_etf);
  bool get adding => _adding;

  void addSymbol(String newSymbol) async {
    _adding = true;
    notifyListeners();
    final stocks = await fetchStocks([newSymbol], Client());
    if (stocks == null || stocks.isEmpty) return;
    final stock = stocks.first;
    _symbols.add(stock);
    _adding = false;
    notifyListeners();
  }
}

我创建了一个专门用于在应用程序开始在 MyApp 中开始为 thestocks和 the获取数据时工作的方法etf,如下所示:

import 'package:flutter/material.dart';
import 'package:my_stock_app/prov_model.dart';
import 'package:provider/provider.dart';
import 'home_page.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => ProvModel()..fetchData(),
      child: MaterialApp(
        theme: ThemeData(
          primaryColor: Colors.black,
          textTheme: TextTheme(
            bodyText2: TextStyle(
              color: Colors.white,
            ),
          ),
        ),
        home: HomePage(),
      ),
    );
  }
}

我试着重构一下代码。这是正常运行的项目:存储库

坚持下去,继续学习!

于 2020-06-30T23:20:07.763 回答