Launch in Chrome.
When calling the _write
or _read
method (I use these methods to save and load json from a file), an error appears: Error reading tasks: Unsupported operation: _Namespace
main.dart
<code>import 'package:flutter/material.dart';
import 'screens/todo_list_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
//const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home:TodoListScreen()
);
}
}
</code>
<code>import 'package:flutter/material.dart';
import 'screens/todo_list_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
//const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home:TodoListScreen()
);
}
}
</code>
import 'package:flutter/material.dart';
import 'screens/todo_list_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
//const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home:TodoListScreen()
);
}
}
todo_list_screen.dart
<code>import '../widgets/task_tile.dart';
import '../task_model.dart';
import 'package:flutter/material.dart';
import 'dart:io';
//import 'package:universal_io/io.dart';
import 'dart:convert';
class TodoListScreen extends StatefulWidget {
@override
_TodoListScreenState createState() => _TodoListScreenState();
}
class _TodoListScreenState extends State<TodoListScreen> with WidgetsBindingObserver{
List<Task> tasks = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Todo List'),
actions: [
FloatingActionButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
String newTaskTitle = '';
return AlertDialog(
title: Text('Add Task'),
content: TextField(
onChanged: (value) {
newTaskTitle = value;
},
),
actions: [
ElevatedButton(
onPressed: () {
setState(() {
tasks.add(Task(title: newTaskTitle));
});
Navigator.pop(context);
},
child: Text('Add'),
),
],
);
},
);
},
child: Icon(Icons.add),
),
FloatingActionButton(onPressed: _write, child: Icon(Icons.save)),
FloatingActionButton(onPressed: _read, child: Icon(Icons.download))
],
),
body: tasks.isEmpty
? Center(
child: Text('List is empty', style: TextStyle(fontSize: 32)),
)
: ListView.builder(
itemCount: tasks.length,
itemBuilder: (context, index) {
return TaskTile(
task: tasks[index],
onDelete: () {
setState(() {
tasks.removeAt(index);
});
});
},
),
persistentFooterAlignment: AlignmentDirectional.centerEnd,
);
}
Future<void> _write() async {
final File file = File('my_file.txt');
await file.create();
final String jsonTasks = jsonEncode(tasks.map((task) => task.toJson()).toList());
await file.writeAsString(jsonTasks, flush: true);
}
Future<void> _read() async {
try {
final File file = File('my_file.txt');
await file.create();
if (await file.exists()) {
final String jsonTasks = await file.readAsString();
final List<dynamic> decodedTasks = jsonDecode(jsonTasks);
setState(() {
tasks = decodedTasks.map((taskJson) => Task.fromJson(taskJson)).toList();
});
}
} catch (e) {
print('Error reading tasks: $e');
}
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
//_read();
}
@override
void dispose() {
//_write();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_read();
} else if (state == AppLifecycleState.paused) {
_write();
}
}
}
</code>
<code>import '../widgets/task_tile.dart';
import '../task_model.dart';
import 'package:flutter/material.dart';
import 'dart:io';
//import 'package:universal_io/io.dart';
import 'dart:convert';
class TodoListScreen extends StatefulWidget {
@override
_TodoListScreenState createState() => _TodoListScreenState();
}
class _TodoListScreenState extends State<TodoListScreen> with WidgetsBindingObserver{
List<Task> tasks = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Todo List'),
actions: [
FloatingActionButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
String newTaskTitle = '';
return AlertDialog(
title: Text('Add Task'),
content: TextField(
onChanged: (value) {
newTaskTitle = value;
},
),
actions: [
ElevatedButton(
onPressed: () {
setState(() {
tasks.add(Task(title: newTaskTitle));
});
Navigator.pop(context);
},
child: Text('Add'),
),
],
);
},
);
},
child: Icon(Icons.add),
),
FloatingActionButton(onPressed: _write, child: Icon(Icons.save)),
FloatingActionButton(onPressed: _read, child: Icon(Icons.download))
],
),
body: tasks.isEmpty
? Center(
child: Text('List is empty', style: TextStyle(fontSize: 32)),
)
: ListView.builder(
itemCount: tasks.length,
itemBuilder: (context, index) {
return TaskTile(
task: tasks[index],
onDelete: () {
setState(() {
tasks.removeAt(index);
});
});
},
),
persistentFooterAlignment: AlignmentDirectional.centerEnd,
);
}
Future<void> _write() async {
final File file = File('my_file.txt');
await file.create();
final String jsonTasks = jsonEncode(tasks.map((task) => task.toJson()).toList());
await file.writeAsString(jsonTasks, flush: true);
}
Future<void> _read() async {
try {
final File file = File('my_file.txt');
await file.create();
if (await file.exists()) {
final String jsonTasks = await file.readAsString();
final List<dynamic> decodedTasks = jsonDecode(jsonTasks);
setState(() {
tasks = decodedTasks.map((taskJson) => Task.fromJson(taskJson)).toList();
});
}
} catch (e) {
print('Error reading tasks: $e');
}
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
//_read();
}
@override
void dispose() {
//_write();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_read();
} else if (state == AppLifecycleState.paused) {
_write();
}
}
}
</code>
import '../widgets/task_tile.dart';
import '../task_model.dart';
import 'package:flutter/material.dart';
import 'dart:io';
//import 'package:universal_io/io.dart';
import 'dart:convert';
class TodoListScreen extends StatefulWidget {
@override
_TodoListScreenState createState() => _TodoListScreenState();
}
class _TodoListScreenState extends State<TodoListScreen> with WidgetsBindingObserver{
List<Task> tasks = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Todo List'),
actions: [
FloatingActionButton(
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
String newTaskTitle = '';
return AlertDialog(
title: Text('Add Task'),
content: TextField(
onChanged: (value) {
newTaskTitle = value;
},
),
actions: [
ElevatedButton(
onPressed: () {
setState(() {
tasks.add(Task(title: newTaskTitle));
});
Navigator.pop(context);
},
child: Text('Add'),
),
],
);
},
);
},
child: Icon(Icons.add),
),
FloatingActionButton(onPressed: _write, child: Icon(Icons.save)),
FloatingActionButton(onPressed: _read, child: Icon(Icons.download))
],
),
body: tasks.isEmpty
? Center(
child: Text('List is empty', style: TextStyle(fontSize: 32)),
)
: ListView.builder(
itemCount: tasks.length,
itemBuilder: (context, index) {
return TaskTile(
task: tasks[index],
onDelete: () {
setState(() {
tasks.removeAt(index);
});
});
},
),
persistentFooterAlignment: AlignmentDirectional.centerEnd,
);
}
Future<void> _write() async {
final File file = File('my_file.txt');
await file.create();
final String jsonTasks = jsonEncode(tasks.map((task) => task.toJson()).toList());
await file.writeAsString(jsonTasks, flush: true);
}
Future<void> _read() async {
try {
final File file = File('my_file.txt');
await file.create();
if (await file.exists()) {
final String jsonTasks = await file.readAsString();
final List<dynamic> decodedTasks = jsonDecode(jsonTasks);
setState(() {
tasks = decodedTasks.map((taskJson) => Task.fromJson(taskJson)).toList();
});
}
} catch (e) {
print('Error reading tasks: $e');
}
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
//_read();
}
@override
void dispose() {
//_write();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
_read();
} else if (state == AppLifecycleState.paused) {
_write();
}
}
}
pubspec.yaml
<code>name: lab1
description: "A new Flutter project."
publish_to: 'none'
version: 0.1.0
environment:
sdk: ^3.5.0
dependencies:
flutter:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^4.0.0
flutter:
uses-material-design: true
</code>
<code>name: lab1
description: "A new Flutter project."
publish_to: 'none'
version: 0.1.0
environment:
sdk: ^3.5.0
dependencies:
flutter:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^4.0.0
flutter:
uses-material-design: true
</code>
name: lab1
description: "A new Flutter project."
publish_to: 'none'
version: 0.1.0
environment:
sdk: ^3.5.0
dependencies:
flutter:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^4.0.0
flutter:
uses-material-design: true