Created
April 19, 2021 00:13
-
-
Save laptopmutia/b9346032248980f45e3494ea7cba4025 to your computer and use it in GitHub Desktop.
Anyone know why ContractTaskDetailPage not rerendered?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:anya/models/contracts/contract.dart'; | |
import 'package:anya/repository/anya_repository.dart'; | |
import 'package:bloc/bloc.dart'; | |
import 'package:equatable/equatable.dart'; | |
import 'package:meta/meta.dart'; | |
part 'contract_detail_state.dart'; | |
class ContractDetailCubit extends Cubit<ContractDetailState> { | |
ContractDetailCubit({ | |
@required AnyaRepository anyaRepository, | |
}) : assert(anyaRepository != null), | |
_anyaRepository = anyaRepository, | |
super(ContractDetailState.loading()); | |
final AnyaRepository _anyaRepository; | |
Future<void> getContract(int id) async { | |
emit(ContractDetailState.loading()); | |
try { | |
final result = await _anyaRepository.getContract(id); | |
emit(ContractDetailState.success(result)); | |
} on Exception { | |
emit(ContractDetailState.failure()); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:anya/contract_detail/contract_detail.dart'; | |
import 'package:anya/contract_detail/view/tasks_list.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter_html/flutter_html.dart'; | |
import 'package:flutter_bloc/flutter_bloc.dart'; | |
class ContractDetailPage extends StatefulWidget { | |
ContractDetailPage({Key key, @required this.id}) : super(key: key); | |
final int id; | |
static Route route(int id) { | |
return MaterialPageRoute<void>( | |
builder: (_) => ContractDetailPage( | |
id: id, | |
), | |
); | |
} | |
final List<Tab> myTabs = <Tab>[ | |
Tab( | |
text: 'Status', | |
icon: Icon(Icons.description), | |
), | |
Tab( | |
text: 'Campaign', | |
icon: Icon(Icons.assignment), | |
), | |
Tab( | |
text: 'Tasks', | |
icon: Icon(Icons.fact_check), | |
), | |
]; | |
@override | |
_ContractDetailPageState createState() => _ContractDetailPageState(); | |
} | |
class _ContractDetailPageState extends State<ContractDetailPage> { | |
@override | |
void initState() { | |
context.read<ContractDetailCubit>().getContract(widget.id); | |
super.initState(); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return DefaultTabController( | |
length: widget.myTabs.length, | |
child: Scaffold( | |
appBar: AppBar( | |
title: BlocBuilder<ContractDetailCubit, ContractDetailState>( | |
builder: (context, state) { | |
switch (state.status) { | |
case ContractDetailStatus.loading: | |
return Text('Contract Detail'); | |
case ContractDetailStatus.success: | |
final contract = state.contract; | |
return Text(contract.campaign.title); | |
case ContractDetailStatus.failure: | |
return Text("something went wrong"); | |
default: | |
return Text("something went default"); | |
} | |
}, | |
), | |
bottom: TabBar( | |
tabs: widget.myTabs, | |
), | |
), | |
body: BlocBuilder<ContractDetailCubit, ContractDetailState>( | |
builder: (context, state) { | |
switch (state.status) { | |
case ContractDetailStatus.loading: | |
return CircularProgressIndicator(); | |
case ContractDetailStatus.success: | |
final contract = state.contract; | |
return TabBarView( | |
children: [ | |
Column( | |
children: [ | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceEvenly, | |
children: [ | |
Container( | |
padding: EdgeInsets.only(left: 8, right: 8), | |
child: Icon(Icons.web)), | |
Expanded(child: Text('Status')), | |
Expanded(child: Text(': ${contract.status}')), | |
], | |
), | |
Row( | |
mainAxisAlignment: MainAxisAlignment.spaceEvenly, | |
children: [ | |
Container( | |
padding: EdgeInsets.only(left: 8, right: 8), | |
child: Icon(Icons.done_outline)), | |
Expanded(child: Text('Finished Task')), | |
Expanded( | |
child: Text( | |
': ${contract.acceptedSubmissions}/${contract.campaign.taskCount}', | |
), | |
) | |
], | |
), | |
], | |
), | |
Html( | |
data: contract.campaign.description, | |
), | |
TaskList( | |
tasks: contract.tasks, | |
contractId: contract.id, | |
) | |
], | |
); | |
case ContractDetailStatus.failure: | |
return Text("something went wrong"); | |
default: | |
return Text("something went default"); | |
} | |
}, | |
), | |
), | |
); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
part of 'contract_detail_cubit.dart'; | |
enum ContractDetailStatus { loading, success, failure } | |
class ContractDetailState extends Equatable { | |
const ContractDetailState._({ | |
this.status = ContractDetailStatus.loading, | |
this.contract = Contract.empty, | |
}); | |
const ContractDetailState.loading() : this._(); | |
const ContractDetailState.success(Contract contract) | |
: this._(status: ContractDetailStatus.success, contract: contract); | |
const ContractDetailState.failure() | |
: this._(status: ContractDetailStatus.failure); | |
final ContractDetailStatus status; | |
final Contract contract; | |
@override | |
List<Object> get props => [status, contract]; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:anya/models/contracts/task.dart'; | |
import 'package:anya/submission_form/view/submission_form_page.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter_html/flutter_html.dart'; | |
class ContractTaskDetailPage extends StatefulWidget { | |
ContractTaskDetailPage({ | |
Key key, | |
@required this.contractId, | |
@required this.task, | |
}) : super(key: key); | |
final Task task; | |
final int contractId; | |
static Route route( | |
Task task, | |
int contractId, | |
) { | |
return MaterialPageRoute<void>( | |
builder: (_) => ContractTaskDetailPage( | |
task: task, | |
contractId: contractId, | |
), | |
); | |
} | |
final List<Tab> myTabs = <Tab>[ | |
Tab( | |
text: 'Description', | |
icon: Icon(Icons.article), | |
), | |
Tab( | |
text: 'Submissions', | |
icon: Icon(Icons.fact_check), | |
), | |
]; | |
@override | |
_ContractTaskDetailPageState createState() => _ContractTaskDetailPageState(); | |
} | |
class _ContractTaskDetailPageState extends State<ContractTaskDetailPage> { | |
@override | |
void initState() { | |
super.initState(); | |
} | |
@override | |
Widget build(BuildContext context) { | |
print(widget.task.submissions.length); | |
return DefaultTabController( | |
length: widget.myTabs.length, | |
child: Scaffold( | |
appBar: AppBar( | |
actions: [ | |
IconButton( | |
icon: const Icon(Icons.add), | |
onPressed: () { | |
Navigator.push( | |
context, | |
SubmissionFormPage.route( | |
taskId: widget.task.id, | |
contractId: widget.contractId, | |
), | |
); | |
}, | |
), | |
], | |
title: Text(widget.task.title), | |
bottom: TabBar( | |
tabs: widget.myTabs, | |
), | |
), | |
body: TabBarView( | |
children: [ | |
Html(data: widget.task.description), | |
ListView.builder( | |
itemCount: widget.task.submissions.length, | |
itemBuilder: (BuildContext context, int index) { | |
final submission = widget.task.submissions[index]; | |
final comments = submission.comments; | |
return ExpansionTile( | |
key: UniqueKey(), | |
childrenPadding: EdgeInsets.only(left: 20), | |
leading: submission.accepted == null | |
? Icon(Icons.check_box_outline_blank) | |
: submission.accepted | |
? Icon(Icons.check_box_outlined) | |
: Icon(Icons.dangerous), | |
title: Text('Submission ${index + 1}'), | |
children: [ | |
TextButton.icon( | |
onPressed: () {}, | |
icon: Icon(Icons.launch), | |
label: Text("Visit Links")), | |
Align( | |
alignment: Alignment.centerLeft, | |
child: Column( | |
children: [ | |
if (comments.isNotEmpty) | |
Text("Client feedbacks:", | |
style: TextStyle( | |
fontWeight: FontWeight.bold, | |
)), | |
for (var comment in comments) Text(comment.body) | |
], | |
), | |
) | |
], | |
); | |
}, | |
), | |
], | |
), | |
), | |
); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:anya/contract_task_detail/contract_task_detail.dart'; | |
import 'package:anya/models/contracts/task.dart'; | |
import 'package:flutter/material.dart'; | |
class TaskList extends StatefulWidget { | |
TaskList({ | |
Key key, | |
this.tasks, | |
this.contractId, | |
}) : super(key: key); | |
final List<Task> tasks; | |
final int contractId; | |
@override | |
_TaskListState createState() => _TaskListState(); | |
} | |
class _TaskListState extends State<TaskList> { | |
@override | |
Widget build(BuildContext context) { | |
return ListView.builder( | |
padding: const EdgeInsets.all(8), | |
itemCount: widget.tasks.length, | |
itemBuilder: (BuildContext context, int index) { | |
final task = widget.tasks[index]; | |
return Container( | |
padding: EdgeInsets.all(16), | |
child: Row( | |
children: [ | |
Padding( | |
padding: EdgeInsets.only(right: 10), | |
child: task.finished | |
? Icon(Icons.check_box_outlined) | |
: Icon(Icons.check_box_outline_blank), | |
), | |
Expanded( | |
child: Text( | |
task.title, | |
style: TextStyle( | |
fontWeight: FontWeight.bold, | |
), | |
), | |
), | |
IconButton( | |
icon: Icon( | |
Icons.launch, | |
), | |
onPressed: () { | |
Navigator.push( | |
context, | |
ContractTaskDetailPage.route( | |
task, | |
widget.contractId, | |
), | |
); | |
}, | |
), | |
], | |
), | |
); | |
}, | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment