CustomPaint
. Thay vào đó, chúng sử dụng RenderObject
hoặc các subclass khác nhau, đặc biệt là RenderBox
. Tạo một widget tùy chỉnh theo cách này sẽ giúp bạn vẽ và định kích thước cho widget linh hoạt nhưng cũng rất phức tạpTổng quan
Tạo một custom render object bao gồm các khía cạnh sau:
CustomPaint
. Bạn sẽ nhận được một canvas để bạn có thể vẽ những thứ mong muốn lên đó.Preview Widget
Khởi tạo Widget
Bước đầu tiên là tạo một widget cho phép bạn truyền các thuộc tính mong muốn vào render object của bạn. Hãy bắt đầu với ba tùy chọn sau:
Hiểu các phần chính của widget
class ProgressBar extends LeafRenderObjectWidget {
@override
RenderProgressBar createRenderObject(...) {}
@override
void updateRenderObject(...) {}
@override
void debugFillProperties(...) {}
}
Ghi chú:
LeafRenderObjectWidget
vì nó không có bất kỳ children nào. Nếu bạn đang tạo một render object với một child, bạn sẽ sử dụng SingleChildRenderObjectWidget
và đối với nhiều children, bạn sẽ sử dụng MultiChildRenderObjectWidget
.createRenderObject
khi nó muốn tạo render object liên kết với widget này. Vì chúng ta đặt tên widget là ProgressBar
, nên theo thói quen, chúng ta đặt tiền tố này bằng “Render” khi đặt tên cho render object. Đó là lý do tại sao bạn có giá trị trả về là RenderProgressBar
. Lưu ý rằng bạn chưa tạo class này. Đó là class render object mà bạn tạo sau.updateRenderObject
, nơi bạn chỉ cần cập nhật các thuộc tính chung của render object của mình mà không cần tạo lại toàn bộ object.debugFillProperties
cung cấp thông tin về các thuộc tính của class trong quá trình debugging, nhưng nó không cần thiết lắm đối với mục đích của bài viết này.Tạo một tệp mới có tên là progress_bar.dart. Thêm code dưới đây vào. Đây chỉ là một phiên bản đầy đủ hơn những gì bạn đã thấy ở trên.
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
class ProgressBar extends LeafRenderObjectWidget {
const ProgressBar({
Key? key,
required this.barColor,
required this.thumbColor,
this.thumbSize = 20.0,
}) : super(key: key);
final Color barColor;
final Color thumbColor;
final double thumbSize;
@override
RenderProgressBar createRenderObject(BuildContext context) {
return RenderProgressBar(
barColor: barColor,
thumbColor: thumbColor,
thumbSize: thumbSize,
);
}
@override
void updateRenderObject(
BuildContext context, RenderProgressBar renderObject) {
renderObject
..barColor = barColor
..thumbColor = thumbColor
..thumbSize = thumbSize;
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.add(ColorProperty('barColor', barColor));
properties.add(ColorProperty('thumbColor', thumbColor));
properties.add(DoubleProperty('thumbSize', thumbSize));
}
}
Bây giờ bỏ qua các lỗi về RenderProgressBar
. Bạn vẫn chưa tạo ra nó.
Trong phiên bản ProgressBar
đã điền đầy đủ thông tin này, bạn có thể thấy các thuộc tính barColor
, thumbColor
và thumbSize
được sử dụng theo những cách sau:
RenderProgressBar
RenderProgressBar
Bây giờ bạn đã tạo ra widget ProgressBar
, đã đến lúc tạo class RenderProgressBar
.
Khởi tạo Render object …. <Phần tiếp>
You need to login in order to like this post: click here
YOU MIGHT ALSO LIKE