используют собственный класс CustomPainter
, который передает Animation
в конструктор super
- таким образом, метод CustomPainter#paint()
автоматически вызывается в каждом «кадре» анимации:
class MyCustomPainter extends CustomPainter {
List points;
Paint linePaint;
Animation anim;
Size size = Size.zero;
MyCustomPainter(Animation anim) : super(repaint: anim) {
linePaint = Paint()
..style = PaintingStyle.stroke
..color = Colors.red
..strokeCap = StrokeCap.round
..strokeWidth = 16;
this.anim = anim;
}
@override
void paint(Canvas canvas, Size size) {
if (size != this.size) {
print('new size $size');
this.size = size;
Rect r = (Offset.zero & size).deflate(linePaint.strokeWidth * 1.5);
points = [
[r.topLeft, r.bottomLeft], // begins
[r.bottomLeft, r.topRight], // ends
].map((o) => anim.drive(Tween(begin: o[0], end: o[1]))).toList();
}
canvas.drawLine(points[0].value, points[1].value, linePaint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
полный рабочий код будет выглядеть следующим образом:
import 'package:flutter/material.dart';
void main() {
runApp(AnimatedPainterTest());
}
class AnimatedPainterTest extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: Builder(
builder: (BuildContext context) {
AnimationController controller = AnimationController(
duration: Duration(milliseconds: 500),
vsync: Scaffold.of(context),
);
return Column(
children: [
RaisedButton(
onPressed: () => controller.forward(from: 0.0),
child: Text('press me to start the animation'),
),
Expanded(
child: SizedBox.expand(
child: CustomPaint(
painter: MyCustomPainter(controller),
),
),
)
],
);
},
),
),
);
}
}
и результат будет:
Так принятие мы можем исключить пользовательскую таблицу, она могла быть переписана как:
select * from expense, transaction where expense_id = transaction_expense_id
Теперь, если Вы хотите применить предел, Вы могли бы сделать это как это:
select * from expense, transaction where expense_id = transaction_expense_id and
expense_id in (select expense_id from expense limit 1)
, который сделал бы то, что Вы хотели? Очевидно, необходимо быть осторожными, о каком порядке expense_ids собираются возвратиться в, таким образом, Вы, вероятно, хотите использовать ORDER BY вообще.
Редактирование: Учитывая ограничение MySQL, описанное в Вашем комментарии ниже, возможно, это будет работать:
select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_id;
Ben
Необходимо будет указать, который расход объект Вы хотите получить. Самое дорогое? Новейшее? Затем соединение против подзапроса, который возвращается только что:
SELECT
expense.*, transaction.*, user.*
FROM
(SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
transaction ON expense_id = transaction_expense_id
Начиная с обновления SQL-сервера не опция, я могу закончить тем, что делал два запроса.
expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id