Моему простому приложению нужно, чтобы нажатие RaisedButton позволило перейти к другому экрану через AlertDialog. При нажатии RaisedButton запись вставляется в базу данных SQFlite, а затем нажимается «Маршрут», чтобы показать другой экран. Проблема в том, что после вставки записей конструктор на FutureBuilder в AddAndMove не работает и остается AlertDialog. Как мне это исправить?
class InputButton extends StatelessWidget {
final JobTypeItem jobType;
InputButton(this.jobType);
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.all(10),
child: ButtonTheme(
minWidth: 250,
child: RaisedButton(
onPressed: () {
showAlert(context);
},
textColor: Colors.white,
padding: const EdgeInsets.all(10),
color: jobType.color.object,
child: Text(jobType.name, style: TextStyle(fontSize: 25)),
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(6.0),
),
),
),
);
}
Future<int> addJob(BuildContext context, int type) async {
await Provider.of<JobLog>(context, listen: false).addJob(Job(
type: type,
date: DateTime.now(),
));
return type;
}
showAlert(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Done?'),
content: Text("Are You Sure Want To Proceed ?"),
actions: <Widget>[
FlatButton(
child: Text("YES"),
onPressed: () {
AddAndMove(
addJob: addJob(context, jobType.type),
);
},
),
],
);
},
);
}
}
class AddAndMove extends StatelessWidget {
final Future<int> addJob;
const AddAndMove({Key key, this.addJob}) : super(key: key);
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: addJob,
builder: (context, dataSnapshot) {
switch (dataSnapshot.connectionState) {
case ConnectionState.waiting:
return Center(
child: const CircularProgressIndicator(),
);
default:
Navigator.of(context).pushReplacementNamed(
RecordListScreen.routeName,
arguments: dataSnapshot.data);
return Container();
}
},
);
}
}
class Job {
DateTime date;
int type;
Job({
@required this.date,
@required this.type,
});
}
class JobLog with ChangeNotifier {
final DatabaseHelper dbHelper = DatabaseHelper.instance;
Future<void> addJob(Job job) async {
Map<String, dynamic> row = {
DatabaseHelper.columnDate: job.date.toIso8601String(),
DatabaseHelper.columnType: job.type,
};
final id = await dbHelper.insert(DatabaseHelper.tableJobLog, row);
print('inserted row id: $id');
notifyListeners();
}
}
class DatabaseHelper {
// make this a singleton class
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
// only have a single app-wide reference to the database
static Database _database;
Future<Database> get database async {
if (_database != null) return _database;
// lazily instantiate the db the first time it is accessed
_database = await _initDatabase();
return _database;
}
// this opens the database (and creates it if it doesn't exist)
_initDatabase() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, _databaseName);
return await openDatabase(path,
version: _databaseVersion,
onCreate: _onCreate);
}
Future<int> insert(String table, Map<String, dynamic> row) async {
Database db = await instance.database;
return await db.insert(table, row);
}
}