Node.js 和 Dart:未处理的异常:类型“String”不是“index”的“int”类型的子类型
这是完整的错误:
E/flutter (10656): [错误:flutter/runtime/dart_vm_initializer(41)] 未处理的异常:类型“String”不是类型“int”的子类型 'index' E/flutter (10656): #0 _DashboardState.getTodoList dashboard.dart:69 E/颤动 (10656):
我该如何解决这个问题?
这是我的代码:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:jwt_decoder/jwt_decoder.dart';
import 'package:velocity_x/velocity_x.dart';
import 'package:http/http.dart' as http;
import 'config.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
class Dashboard extends StatefulWidget {
final token;
const Dashboard({@required this.token, Key? key}) : super(key: key);
@override
State<Dashboard> createState() => _DashboardState();
}
class _DashboardState extends State<Dashboard> {
late String userId;
final TextEditingController _todoTitle = TextEditingController();
final TextEditingController _todoDesc = TextEditingController();
List? items = [];
@override
void initState() {
super.initState();
Map<String, dynamic> jwtDecodedToken = JwtDecoder.decode(widget.token);
userId = jwtDecodedToken['_id'];
getTodoList(userId);
}
void addTodo() async {
if (_todoTitle.text.isNotEmpty && _todoDesc.text.isNotEmpty) {
var regBody = {
"userId": userId,
"title": _todoTitle.text,
"desc": _todoDesc.text
};
var response = await http.post(Uri.parse(addtodo),
headers: {"Content-Type": "application/json"},
body: jsonEncode(regBody));
var jsonResponse= await json.decode(json.encode(response.body));
// var jsonResponse = jsonDecode(response.body);
print(jsonResponse['status']);
if (jsonResponse['status']) {
_todoDesc.clear();
_todoTitle.clear();
Navigator.pop(context);
getTodoList(userId);
} else {
print("SomeThing Went Wrong");
}
}
}
void getTodoList(userId) async {
var regBody = {"userId": userId};
var response = await http.post(Uri.parse(getToDoList),
headers: {"Content-Type": "application/json"},
body: jsonEncode(regBody));
var jsonResponse= await json.decode(json.encode(response.body));
// var jsonResponse = jsonDecode(response.body);
items = jsonResponse['success'];
setState(() {});
}
void deleteItem(id) async {
var regBody = {"id": id};
var response = await http.post(Uri.parse(deleteTodo),
headers: {"Content-Type": "application/json"},
body: jsonEncode(regBody));
var jsonResponse = jsonDecode(response.body);
if (jsonResponse['status']) {
getTodoList(userId);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.lightBlueAccent,
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.only(
top: 60.0, left: 30.0, right: 30.0, bottom: 30.0),
child: const Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CircleAvatar(
backgroundColor: Colors.white,
radius: 30.0,
child: Icon(
Icons.list,
size: 30.0,
),
),
SizedBox(height: 10.0),
Text(
'ToDo with NodeJS + Mongodb',
style: TextStyle(fontSize: 30.0, fontWeight: FontWeight.w700),
),
SizedBox(height: 8.0),
Text(
'Add your todo and get started!',
style: TextStyle(fontSize: 30.0, color: Colors.white),
),
],
),
),
Expanded(
child: Container(
width: MediaQuery.of(context).size.width,
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20))),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: items == null
? null
: ListView.builder(
itemCount: items!.length,
itemBuilder: (context, int index) {
return Slidable(
key: const ValueKey(0),
endActionPane: ActionPane(
motion: const ScrollMotion(),
dismissible: DismissiblePane(onDismissed: () {}),
children: [
SlidableAction(
backgroundColor: const Color(0xFFFE4A49),
foregroundColor: Colors.black,
icon: Icons.delete,
label: 'Delete',
onPressed: (BuildContext context) {
print('${items![index]['_id']}');
deleteItem('${items![index]['_id']}');
},
),
],
),
child: Card(
borderOnForeground: false,
child: ListTile(
leading: const Icon(Icons.task),
title: Text('${items![index]['title']}'),
subtitle: Text('${items![index]['desc']}'),
trailing: const Icon(Icons.arrow_back),
),
),
);
}),
),
),
)
],
),
floatingActionButton: FloatingActionButton(
onPressed: () => _displayTextInputDialog(context),
tooltip: 'Add-ToDo',
child: Icon(Icons.add),
),
);
}
Future<void> _displayTextInputDialog(BuildContext context) async {
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Add To-Do'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: _todoTitle,
keyboardType: TextInputType.text,
decoration: const InputDecoration(
filled: true,
fillColor: Colors.white,
hintText: "Title",
border: OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(10.0)))),
).p4().px8(),
TextField(
controller: _todoDesc,
keyboardType: TextInputType.text,
decoration: const InputDecoration(
filled: true,
fillColor: Colors.white,
hintText: "Description",
border: OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(10.0)))),
).p4().px8(),
ElevatedButton(
onPressed: () {
addTodo();
},
child: const Text("Add"))
],
));
});
}
}
config.dart
const url = 'http://x:3000/';
const registration = "${url}registration";
const login = '${url}login';
const addtodo = '${url}storeTodo';
const getToDoList = url + 'getUserTodoList';
const deleteTodo = '${url}deleteTodo';
todo.router.js
const router = require('express').Router();
const TodoController = require('../controller/todo.controller');
router.post('/storeTodo', TodoController.createTodo);
router.get('/getUserTodoList', TodoController.getUserTodo);
module.exports = router;
我试过这个:
List? items = [];
到这个:List? items;
没有运气
感谢您提供的任何帮助
回答如下: