首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >NoSuchMethodError:对null调用了方法'transaction‘。接收器:空Dart颤动

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
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
运行
复制
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 21:58:30

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

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

https://stackoverflow.com/questions/51912822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档