Skip to content

Instantly share code, notes, and snippets.

@imaNNeo
Created March 14, 2021 22:00
Show Gist options
  • Save imaNNeo/de0163c307df519d287e6db043b8d707 to your computer and use it in GitHub Desktop.
Save imaNNeo/de0163c307df519d287e6db043b8d707 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(
showingIndex: 3,
builder: (context, index) {
return Text(
'$index',
style: shinyTextStyle(index),
);
},
),
),
),
);
}
TextStyle shinyTextStyle(int index) {
if (index < 10) {
return TextStyle(color: Colors.black);
} else {
return TextStyle(color: Colors.indigo);
}
}
}
class MyWidget extends LeafRenderObjectWidget {
const MyWidget({
this.showingIndex = 0,
required this.builder,
Key? key,
}) : super(key: key);
final int showingIndex;
final IndexedWidgetBuilder builder;
@override
RenderMyWidget createRenderObject(BuildContext context) => RenderMyWidget(showingIndex, builder);
@override
void updateRenderObject(BuildContext context, RenderMyWidget renderObject) {
renderObject
..showingIndex = showingIndex
..builder = builder;
}
}
class RenderMyWidget extends RenderBox {
RenderMyWidget(int showingIndex, IndexedWidgetBuilder builder)
: _showingIndex = showingIndex,
_builder = builder;
int get showingIndex => _showingIndex;
int _showingIndex;
set showingIndex(int showingIndex) {
if (_showingIndex == showingIndex) return;
_showingIndex = showingIndex;
markNeedsPaint();
}
IndexedWidgetBuilder get builder => _builder;
IndexedWidgetBuilder _builder;
set builder(IndexedWidgetBuilder value) {
if (_builder == value) return;
_builder = value;
}
@override
void performLayout() {
size = Size(constraints.maxWidth, constraints.maxHeight);
}
TextStyle hardcodedTextStyle = TextStyle(
color: Colors.black,
fontSize: 100,
);
@override
void paint(PaintingContext context, Offset offset) {
TextPainter textPainter = new TextPainter(
text: TextSpan(text: '$showingIndex', style: hardcodedTextStyle),
textDirection: TextDirection.rtl,
);
textPainter.layout();
textPainter.paint(context.canvas, offset);
// Todo: How can I paint this widget from my builder
// Widget showingWidget = builder(buildContext, showingIndex);
// context.paintChild(showingWidget, offset);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment