You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Dart
		
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:intl/intl.dart' as intl;
 | 
						|
 | 
						|
class CustomAutoDirection extends StatefulWidget {
 | 
						|
  final String text;
 | 
						|
  final Widget child;
 | 
						|
  final void Function(bool isRTL)? onDirectionChange;
 | 
						|
 | 
						|
  const CustomAutoDirection({Key? key, required this.text, required this.child, this.onDirectionChange}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  _CustomAutoDirectionState createState() => _CustomAutoDirectionState();
 | 
						|
}
 | 
						|
 | 
						|
class _CustomAutoDirectionState extends State<CustomAutoDirection> {
 | 
						|
  late String text;
 | 
						|
  late Widget childWidget;
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    text = widget.text;
 | 
						|
    childWidget = widget.child;
 | 
						|
    return Directionality(textDirection: isRTL(text) ? TextDirection.rtl : TextDirection.ltr, child: childWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  void didUpdateWidget(CustomAutoDirection oldWidget) {
 | 
						|
    if (isRTL(oldWidget.text) != isRTL(widget.text)) {
 | 
						|
      WidgetsBinding.instance.addPostFrameCallback((_) => widget.onDirectionChange?.call(isRTL(widget.text)));
 | 
						|
    }
 | 
						|
    super.didUpdateWidget(oldWidget);
 | 
						|
  }
 | 
						|
 | 
						|
  bool isRTL(String text) {
 | 
						|
    if (text.isEmpty) return Directionality.of(context) == TextDirection.rtl;
 | 
						|
    return intl.Bidi.detectRtlDirectionality(text);
 | 
						|
  }
 | 
						|
}
 |