Skip to content

Instantly share code, notes, and snippets.

@laptopmutia
Created April 19, 2021 00:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save laptopmutia/b9346032248980f45e3494ea7cba4025 to your computer and use it in GitHub Desktop.
Save laptopmutia/b9346032248980f45e3494ea7cba4025 to your computer and use it in GitHub Desktop.
Anyone know why ContractTaskDetailPage not rerendered?
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());
}
}
}
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");
}
},
),
),
);
}
}
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];
}
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)
],
),
)
],
);
},
),
],
),
),
);
}
}
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