Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >NoSuchMethodError:对null调用了方法'transaction‘。接收器:空Dart颤动

NoSuchMethodError:对null调用了方法'transaction‘。接收器:空Dart颤动
EN

Stack Overflow用户
提问于 2018-08-18 21:51:05
回答 1查看 1.8K关注 0票数 2

嗨,所以我正在尝试用Flutter制作一个应用程序,但我很难弄清楚哪里出了问题。我正在尝试让它在你点击一个按钮的时候,它会将它的名字添加到sqflite数据库中,但是无论我怎么尝试,似乎都不起作用。这个值等于写操作,但是我得到了一个空错误。

这是一个页面,它将你可以选择的硬币放在一个列表中。它可以工作,但我正在尝试添加,当您单击列表时,它会将名称添加到数据库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:nodemarketcap/database.dart';
import 'package:sqflite/sqflite.dart';
class AddCoinPage extends StatefulWidget {
  final DatabaseClient databaseClient;

  AddCoinPage({Key key, @required this.databaseClient}) : super(key: key);
  @override
  _AddCoinPageState createState() => new _AddCoinPageState();
}



class _AddCoinPageState extends State<AddCoinPage> {
  TextEditingController controller = new TextEditingController();
  String coin;

   addCoin(coinname) async {
    setState(() {
      coin = coinname;
    });
    return widget.databaseClient.addCoin(coin);
  }
  // Get json result and convert it to model. Then add
  Future<Null> getUserDetails() async {
    final response = await http.get(url);
    final responseJson = json.decode(response.body);

    setState(() {
      _userDetails.clear();
      for (Map user in responseJson) {
        _userDetails.add(UserDetails.fromJson(user));
      }
    });
  }


  @override
  void initState() {
    super.initState();

    getUserDetails();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Add Coin'),
        backgroundColor: new Color(0xFF090909),
        elevation: 0.0,
      ),
      body: new Column(
        children: <Widget>[
          new Container(
            color: Colors.white,
            child: new Padding(
              padding: const EdgeInsets.all(8.0),
              child: new Card(
                child: new ListTile(
                  leading: new Icon(Icons.search),
                  title: new TextField(
                    controller: controller,
                    decoration: new InputDecoration(
                        hintText: 'Search', border: InputBorder.none),
                    onChanged: onSearchTextChanged,
                  ),
                  trailing: new IconButton(icon: new Icon(Icons.cancel), onPressed: () {
                    controller.clear();
                    onSearchTextChanged('');
                  },),
                ),
              ),
            ),
          ),
          new Expanded(
            child: _searchResult.length != 0 || controller.text.isNotEmpty
                ? new ListView.builder(
              itemCount: _searchResult.length,
              itemBuilder: (context, i) {
                return new Card(
                  child: new ListTile(
                    title: new Text(_searchResult[i].name),
                      onTap: () {addCoin((_searchResult[i].name).toString());}
                  ),
                  margin: const EdgeInsets.all(0.0),
                );
              },
            )
                : new ListView.builder(
              itemCount: _userDetails.length,
              itemBuilder: (context, index) {
                return new Card(
                  child: new ListTile(
                    title: new Text(_userDetails[index].name),
                    onTap: () {addCoin(_userDetails[index].name);}
                  ),
                  margin: const EdgeInsets.all(0.0),
                );
              },
            ),
          ),
        ],
      ),
    );
  }

  onSearchTextChanged(String text) async {
    _searchResult.clear();
    if (text.isEmpty) {
      setState(() {});
      return;
    }

    _userDetails.forEach((userDetail) {
      if (userDetail.name.contains(text))
        _searchResult.add(userDetail);
    });

    setState(() {});
  }
}

List<UserDetails> _searchResult = [];

List<UserDetails> _userDetails = [];

final String url = 'https://nodemarketcap.com/api/api';
class UserDetails {
  final String name;

  UserDetails({this.name});

  factory UserDetails.fromJson(Map<String, dynamic> json) {
    return new UserDetails(
      name: json['name'],
    );
  }
}

这是数据库类文件夹。我只使用了其中的第一个类;第二个类更像是一次失败的尝试,并不是我想要的方式,但我保留了它,以防我需要重用一些东西。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:convert';

class DatabaseClient  {
  Database database;

  Future create() async {
    Directory path = await getApplicationDocumentsDirectory();
    String dbPath = join(path.path, "database.db");

    database  = await openDatabase(dbPath, version: 1,
        onCreate: this._create);

  }
  Future _create(Database db, int version) async {
    await db.execute("""
            CREATE TABLE coins (
            id INTEGER PRIMARY KEY, 
            name VARCHAR(60) NOT NULL,
                  nameb VARCHAR(60) NOT NULL,
                  tickerCap VARCHAR(60) NOT NULL,                   
            roi DECIMAL(8, 2) NOT NULL,
            usdvalue DECIMAL(20, 6) NOT NULL,
            changep DECIMAL(6, 2) NOT NULL,
            mnCost BIGINT UNSIGNED NOT NULL,
            mncount BIGINT UNSIGNED  NOT NULL,          
            mnpriceusd DECIMAL(20, 2) NOT NULL,
            usdvol DECIMAL(30, 2) NOT NULL,
            dailyUSD DECIMAL(20, 4) NOT NULL,
            dailyBTC DECIMAL(20, 8) NOT NULL,
            monthlyUSD DECIMAL(20, 4) NOT NULL,
            monthlyBTC DECIMAL(20, 8) NOT NULL,
            yearlyUSD DECIMAL(20, 4) NOT NULL,
            yearlyBTC DECIMAL(20, 8) NOT NULL,  
            btcval DECIMAL(20, 8) NOT NULL, 
            usdMarketCap DECIMAL(20, 2) NOT NULL,   
            btcMarketCap DECIMAL(20, 2) NOT NULL,   
            btcvol DECIMAL(20, 8) NOT NULL
            )""");
  }
  addCoin (String name) async {
    await database.transaction((txn) async {
      int id1 = await txn.rawInsert(
          'INSERT INTO coins(name, nameb, tickerCap, roi, usdvalue, changep, mnCost, mncount, mnpriceusd, usdvol, dailyUSD, dailyBTC, monthlyUSD, monthlyBTC, yearlyUSD, yearlyBTC, btcval, usdMarketCap, btcMarketCap, btcvol) VALUES(name, "refresh", "refresh", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)');
      print("insertedcoin: $id1");
    });
  }
  updateCoin (name, nameb, tickerCap, roi, usdvalue, changep, mnCost, mncount, mnpriceusd, usdvol, dailyUSD, dailyBTC, monthlyUSD, monthlyBTC, yearlyUSD, yearlyBTC, btcval, usdMarketCap, btcMarketCap, btcvol) async {
    int update = await database.rawUpdate(
        'UPDATE coins SET nameb = ?, tickerCap = ?, roi = ?, usdvalue = ?, changep = ?, mnCost = ?, mncount = ?, mnpriceusd = ?, usdvol = ?, dailyUSD = ?, dailyBTC = ?, monthlyUSD = ?, monthlyBTC = ?, yearlyUSD = ?, yearlyBTC = ?, btcval = ?, usdMarketCap = ?, btcMarketCap = ?, btcvol = ?  WHERE name = ?',
        [nameb, tickerCap, roi, usdvalue, changep, mnCost, mncount, mnpriceusd, usdvol, dailyUSD, dailyBTC, monthlyUSD, monthlyBTC, yearlyUSD, yearlyBTC, btcval, usdMarketCap, btcMarketCap, btcvol, name]);
    print("updated: $update");
  }
  getTest () async {
    List<Map> list = await database.rawQuery('SELECT * FROM coins');
    print(list);
  }
}

class Coins {
  Coins();

  int id;
  String name;
  String nameb;
  String tickerCap;
  double roi;
  double usdvalue;
  double changep;
  int mnCost;
  int mncount;
  double mnpriceusd;
  double usdvol;
  double dailyUSD;
  double dailyBTC;
  double monthlyUSD;
  double monthlyBTC;
  double yearlyUSD;
  double yearlyBTC;
  double btcval;
  double usdMarketCap;
  double btcMarketCap;
  double btcvol;

  static final columns = ["id", "name", "nameb", "tickerCap", "roi", "usdvalue", "changep", "mnCost", "mncount", "mnpriceusd", "usdvol", "dailyUSD", "dailyBTC", "monthlyUSD", "monthlyBTC", "yearlyUSD", "yearlyBTC", "btcval", "usdMarketCap", "btcMarketCap", "btcvol"];

  Map toMap() {
    Map map = {
      "name": name,
      "nameb": nameb,
      "tickerCap": tickerCap,
      "roi": roi,
      "usdvalue": usdvalue,
      "changep": changep,
      "mnCost": mnCost,
      "mncount": mncount,
      "mnpriceusd": mnpriceusd,
      "usdvol": usdvol,
      "dailyUSD": dailyUSD,
      "dailyBTC": dailyBTC,
      "monthlyUSD": monthlyUSD,
      "monthlyBTC": monthlyBTC,
      "yearlyUSD": yearlyUSD,
      "yearlyBTC": yearlyBTC,
      "btcval": btcval,
      "usdMarketCap": usdMarketCap,
      "btcMarketCap": btcMarketCap,
      "btcvol": btcvol
    };
    if (id != null) {
      map["id"] = id;
    }
    return map;
  }
  static fromMap(Map map) {
    Coins coins = new Coins();
    coins.id = map["id"];
    coins.name = map["name"];
    coins.nameb = map["nameb"];
    coins.tickerCap = map["tickerCap"];
    coins.roi = map["roi"];
    coins.usdvalue = map["usdvalue"];
    coins.changep = map["changep"];
    coins.mnCost = map["mnCost"];
    coins.mncount = map["mncount"];
    coins.mnpriceusd = map["mnpriceusd"];
    coins.usdvol = map["usdvol"];
    coins.dailyUSD = map["dailyUSD"];
    coins.dailyBTC = map["dailyBTC"];
    coins.monthlyUSD = map["monthlyUSD"];
    coins.yearlyUSD = map["yearlyUSD"];
    coins.yearlyBTC = map["yearlyBTC"];
    coins.btcval = map["btcval"];
    coins.usdMarketCap = map["usdMarketCap"];
    coins.btcMarketCap = map["btcMarketCap"];
    coins.btcvol = map["btcvol"];
    return coins;
  }
}

这是我得到的错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
08-18 15:06:20.845 19017-19136/com.nodemarketcap.nodemarketcap E/flutter: [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
    NoSuchMethodError: The method 'transaction' was called on null.
    Receiver: null
    Tried calling: transaction<Null>(Closure: (Transaction) => Future<Null>)
    #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:46:5)
    #1      DatabaseClient.addCoin (package:nodemarketcap/database.dart:46:20)
    <asynchronous suspension>
    #2      _AddCoinPageState.addCoin (package:nodemarketcap/add_coin_page.dart:26:34)
    <asynchronous suspension>
    #3      _AddCoinPageState.build.<anonymous closure>.<anonymous closure> (package:nodemarketcap/add_coin_page.dart:100:32)
    #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:494:14)
    #5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:549:30)
    #6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
    #7      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:161:9)
    #8      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:123:7)
    #9      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
    #10     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
    #11     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
    #12     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
    #13     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
    #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
    #15     _invoke1 (dart:ui/hooks.dart:134:13)
    #16     _dispatchPointerDataPacket (dart:ui/hooks.dart:91:5)

所以我试着让它工作但是撞到了我的头。我可能正在做一些愚蠢的事情,所以如果有人可以告诉我我做错了什么,并告诉我我可以改进什么。:P IDK,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-06-28 13:58:30

错误The method 'transaction' was called on null.指出在null方法上调用了transaction。此问题的可能原因是database为空。请确保初始化database以解决此问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51912822

复制
相关文章
HttpClient来自官方的JSON扩展方法
Json的序列化和反序列化是我们日常常见的操作,通过System.Net.Http.Json我们可以用少量的代码实现上述操作.正如在github设计文档中所描述
HueiFeng
2020/04/13
1.2K0
HttpClient来自官方的JSON扩展方法
Json的序列化和反序列化是我们日常常见的操作,通过System.Net.Http.Json我们可以用少量的代码实现上述操作.正如在github设计文档中所描述
HueiFeng
2020/04/15
1K0
【API架构】使用 JSON API 的好处
在 API 工艺的世界里,没有比设计更受热议的领域了。从 REST、gRPC 到 GraphQL,有许多方法可以设计和标准化 Web API 交互。今天,我们将注意力转向另一种方法,JSON API,JSONAPI.org 上详细介绍的用于构建 API 的规范。
架构师研究会
2022/05/29
2.8K0
python匹配两个文件中相同的内容
data_small.txt中内容如下: 343 0 5258 1 3973 2 data_big.txt中内容如下: 343 2009-05-30T17:01:58Z 39.04183745 -94.5914053833 9191 343 2009-05-28T23:40:31Z 39.0523183095 -94.6074986458 8904 23 2009-05-28T23:40:31Z 39.0523183095 -94.6074986458 8904 56 2009-05-27T18:59:50Z 39.0424168 -94.59061145 9188 5258 2009-05-15T00:09:42Z 38.9920234667 -94.5920920333 10927 5258 2009-05-27T18:59:50Z 39.0424168 -94.59061145 9188 545 2009-05-15T00:09:42Z 38.9920234667 -94.5920920333 10927 3973 2009-05-14T20:47:20Z 39.0142536 -94.5928215833 12305 3973 2009-05-14T20:43:05Z 39.0146281324 -94.5907831192 9627
全栈程序员站长
2022/11/07
2.3K0
Chrome 102:新增两个 HTML 属性、两个 JS API !
inert 属性是一个全局的 HTML 属性,它可以告诉浏览器忽略元素的用户输入事件,包括焦点事件和来自辅助技术的其他事件。主要是下面两种用例:
ConardLi
2023/01/09
1.9K0
Chrome 102:新增两个 HTML 属性、两个 JS API !
让Laravel API永远返回JSON格式响应的方法示例
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。它基于ECMA262语言规范(1999-12第三版)中JavaScript编程语言的一个子集。 JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的习惯,这些特性使JSON成为理想的数据交换格式。
用户2323866
2021/07/13
2.7K0
JSON API
FreeSWITCH早在1.4时代就有了JSON API,然而,却没有引起大家的重视。其实,JSON API的设计有更好的结构化和扩展性,配合HTTP和Websocket接口,必将大有作为。
杜金房
2020/12/21
9210
推荐两个C++API参考网站
C++ 标准库接口众多。在实际使用时如果不熟悉常常感到无从下手。阅读开源代码时,常常能看到使用C++新特性的优美代码,但却显得那么陌生。
首飞
2022/04/18
2.8K0
推荐两个C++API参考网站
Spring Boot 中如何统一 API 接口响应格式?
松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
江南一点雨
2021/04/01
1.3K0
来自群友的分享
我是来自某大学本科,刚打完一个关于机器人的比赛,简单来说我在里面是负责识别一排矩形物体,返回最近的一个长方体并返回其相对于深度相机的三维坐标和角度。因为要使机器人运动,所以相对于机器人的角度信息也是必要的。
点云PCL博主
2019/07/30
8110
来自群友的分享
性能工具之JMeter两个Java API Demo
https://github.com/7DGroup/JMeter-API-Demo
高楼Zee
2019/07/17
2K0
JSON Web 令牌(JWT)是如何保护 API 的
你可以已经听说过 JSON Web Token (JWT) 是目前用于保护 API 的最新技术。
用户4283147
2022/10/27
2.1K0
Shenandoah GC:一个来自JDK12的全新并发压缩垃圾回收器
是不是才听说了JDK11的ZGC,并且还没搞懂?不好意思,OpenJDK12马不停蹄的带来了Shenandoah GC。
Java_老男孩
2019/12/02
1.5K0
Automa-通过连接块来自动化你的浏览器
通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。
wangmcn
2023/08/22
7700
Automa-通过连接块来自动化你的浏览器
Ids4 认证保护 API 方案更新
可能你咋一看这个标题不知道什么意思,其实我也没想好怎么表达,因为是一个特别简单的小知识点。
老张的哲学
2022/04/11
9680
Ids4 认证保护 API 方案更新
Solr 如何自动导入来自 MySQL 的数据
在笔记 2 中,可能在执行导入时会报错,那是因为还需要将 mysql-connector-java-xxx.jar 放入 solr-xxx/server/lib 文件夹下;
村雨遥
2022/06/15
2K0
Solr 如何自动导入来自 MySQL 的数据
来自Byron同学的解答
使用了第三方的网页分析模块BeautifulSoup,可以从这里下载最新版:http://www.crummy.com/software/BeautifulSoup/ =============== #!usr/bin/python #coding:utf-8 ''' @author:Byron 新浪围脖:http://weibo.com/ziyuetk ''' import urllib2 from bs4 import BeautifulSoup print "豆瓣正在热映:" url = "http:
Crossin先生
2018/04/17
6530
点击加载更多

相似问题

来自linkedin的JSON api响应

19

在视图中显示来自api的JSON响应

10

来自SpreadSheet API的JSON响应

28

来自json API响应的列表

112

来自服务器的JSON响应来自R- REST API

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文