ОГРАНИЧЕНИЕ СОЕДИНЕНИЯ SQL

используют собственный класс 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),
                    ),
                  ),
                )
              ],
            );
          },
        ),
      ),
    );
  }
}

и результат будет:

enter image description here

22
задан Benjamin 31 May 2016 в 11:39
поделиться

3 ответа

Так принятие мы можем исключить пользовательскую таблицу, она могла быть переписана как:

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

12
ответ дан Ben 29 November 2019 в 05:36
поделиться

Необходимо будет указать, который расход объект Вы хотите получить. Самое дорогое? Новейшее? Затем соединение против подзапроса, который возвращается только что:

SELECT
    expense.*, transaction.*, user.*
FROM
    (SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
    transaction ON expense_id = transaction_expense_id
9
ответ дан David Schmitt 29 November 2019 в 05:36
поделиться

Начиная с обновления SQL-сервера не опция, я могу закончить тем, что делал два запроса.

expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
    expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
2
ответ дан Thomas R 29 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: